Newsgroup: it.comp.os.linux.development
Titolo: Script per eliminare doppioni in un file

Devo realizzare uno script che mi elimini le parole doppie che sono
presenti in un file. Per esempio ho un file che chiamo A.txt dove c'è:
mela
pera
banana
mela
mela
pera
ciliegia
banana
Quello che a me servirebbe è creare un piccolo script che pulisca la
lista rendendola:
mela
pera
banana
ciliegia
Avevo pensato di mettere il file A in un array e poi controllarlo
elemento per elemento. Esempio:
1. Prendo la prima linea di A e la scrivo sul file B;
2. Prendo la seconda linea di A, controllo che sul file B non ci sia:
se non c'è la scrivo sul file B;
3. Torno al passo 2 fino alla fine del file.
Cosa ne dite? Qualche altro metodo più veloce?
Ciao a tutti, Keres.

 Devo realizzare uno script che mi elimini le parole doppie
sort miofile | uniq

cat il_tuo_file_con_doppioni | uniq > /tmp/appoggio
cp /tmp/appoggio > il_tuo_file_con_doppioni

 cp /tmp/appoggio > il_tuo_file_con_doppioni
meglio sarebbe:
$ uniq miofile miofile.uniq
$ # verifica che e` tutto a posto
  # E se proprio la versione originaria non serve
$ mv miofile.uniq miofile  

 cp /tmp/appoggio > il_tuo_file_con_doppioni
meglio sarebbe:
$ uniq miofile  > miofile.uniq
$ # verifica che e` tutto a posto
  # E se proprio la versione originaria non serve
$ mv miofile.uniq miofile  
PS Scusate il refuso. 
Spero di aver corretto in tempo.

 sort miofile | uniq
 sort -u miofile
M

 
Hai ragione ;P

 Spero di aver corretto in tempo.
No. :-D
Scherzi a parte, Thunderbird (eh ehm, Icedove) l'ha scaricato, ma ora
appare "Il messaggio è scaduto"... però resta quel messaggio solo
soletto, povero :-P
Cheers,
David
P.S.: piaciuta la soluzione cross-platform?! *lol* :-)
-- 
         Linux Registered User #334216
Get FireFox! >> 
http://snipurl.com/gofoxygo/
 <<
Blog         >>  
http://www.hanskalabs.net/
  <<
Staff        >> 
http://www.debianizzati.org/
 <<

 l'ordine delle righe,...
cat -n pippo | sort -d --key=2 -u | sort -n | cut -f2-

 ......
Volendo eliminare i duplicati - mantenendo pero' l'ordine delle righe - 
una soluzione 'naturale' potrebbe essere quella di usare il perl. Per 
es., qualcosa del genere...:
perl -ne 'print unless $k{$_}++' <miofile
Anche in PHP si potrebbe risolvere il problema con un'unica linea di 
comando (tipo l'esempio sopra in perl):
(es. solo x PHP5)
php -n -R 'if(!$k[$argn]++) echo "$argn\n";' <miofile
(es. x PHP4 o 5)
php -n -r 'foreach(@array_unique(file("php://stdin")) as $s) echo $s;' 
<miofile
nb: ho fatto degli esempi rozzi e inefficienti, pero' soluzioni del 
genere tornano utili quando il tempo e' poco e devi fare qualcosa al volo...
Ovviamente, se l'ordine delle righe non dovesse essere un vincolo, la 
soluzione piu' immediata (ed efficiente) e' sicuramente quella gia' 
postata del "sort -u miofile".
Ciao
-- 
Cybertoldo
Per rispondermi via email, sostituisci moc.liamg con 
gmail.com

 cat -n pippo | sort -d --key=2 -u | sort -n | cut -f2-
caspita! ingegnoso...! :-|


 cat -n pippo | sort -d --key=2 -u | sort -n | cut -f2-
Uh... anche leggendomi i man di sort e cut (sort l'avevo sempre usato
"da solo"... cut, mai usato, ho sempre usato awk), non riesco a capirne
la logica... mi spieghi? :-P


Che dire... Grazie mille a tutti voi... Sarò debitore di una bella
birra fredda virtuale...
Ho risolto con:  sort -u primo_log.txt
Ciao ciao ciao!!!

 Ciao
Ciao!
David
P.S.: scusate l'OT in cui ci stiamo approfondendo, roba da
it.comp.www.php o altro, ma è abbastanza interessante.. :-)


  non riesco a capirne la logica... mi spieghi? :-P
uniq serve a eliminare le righe ripetute.
Da solo non serve poiche` funziona solo se 
i doppioni sono consecutivi.
Il rimedio e` semplice: ordinare il file in
modo che le righe uguali siano consecutive.
Ora stiamo a:
sort | uniq
Ma cio` altera l'ordine delle righe; se cio`
non ci sta bene dobbiamo fare un ulteriore 
passo per annullare l'ordinameto, come fosse:
sort | uniq | unsort
Pero` per ripristinare l'ordinamento abbiamo 
bisogno di salvare le informazioni sull'
ordinamento originario prima di ordinate il 
file e per fortuna questo e` banale da ottenere; 
basta numerare le righe del file e poi per 
ripristinare basta ordinare seguendo l'ordine 
numerico originario:
cat -n | sort | uniq | sort -n 
(potremmo usare nl ma cat e` piu` semplice)
Ora il problema e` che abbiamo alterato l'input 
del primo sort e quindi dobbiamo prendere 
provvedimenti; diciamo a sort trascurare il 
primo campo (che e` il numero di riga aggiunto 
da noi):
cat -n | sort -k2 | uniq | sort -n
Ora dobbiamo informare anche uniq di trascurare 
il primo campo:
cat -n | sort -k2 | uniq -f2 | sort -n
Ed infine si deve eliminare le metainformazioni 
aggiunte (i numeri di riga); cut e` la scelta piu` 
semplice:
cat -n | sort -k2 | uniq -f2 | sort -n | cut -f2
Come ultima cosa notiamo che benche` sort|uniq|sort
e` un costrutto molto frequente e molto flessibile
nel nostro caso si puo` sostituire (e crea meno 
problemi) sort|uniq con sort -u ed in definitiva:
cat -n $file | sort -k2 -u | sort -n | cut -f2-
Difficile? No, e` solo un altro modo di programmare: 
pensare al flusso dei dati.
Post scripta:
L'opzione -d e` una cosa che ho dimenticato di cancellare.
--key=2 e` la versione lunga di -k2


IO TI ADORO.
Quando ci sposiamo? :-D
Scherzi a parte... grazie mille ;-)
David


 it.comp.www.php o altro, ma è abbastanza interessante..  :-) 
...forse non e' del tutto OT:
http://www.news.nic.it/manif/it.comp.os.linux.development.html


 Ciao
Grazie ancora,
David


 $_ equivale ad $argn, lo STDIN in pratica. Right?
in $_ c'e' la linea corrente (sei dentro un costrutto: while (<>) 
{...}). Differentemente da $argn del php5, in $_ c'e' anche l'eventuale 
'\n' finale).


 '\n' finale).
:-) Rileggendo l'ultima frase davanti ad un panino, ho realizzato che 
forse sarebbe stato meglio scrivere:
perl -ne 'chomp; print "$_\n" unless $k{$_}++' <miofile
(l'ultima linea di testo potrebbe non essere terminata da '\n')
