2013-08-11 18 views
7

Ho appena un file.txt con più righe, vorrei rimuovere le linee duplicate senza ordinare il file. quale comando posso usare in unix bash?come eliminare le righe duplicate in un file di testo in unix bash?

campione di file.txt

orangejuice;orange;juice_apple 
pineapplejuice;pineapple;juice_pineapple 
orangejuice;orange;juice_apple 

campione di uscita:

orangejuice;orange;juice_apple 
pineapplejuice;pineapple;juice_pineapple 
+0

mi piacerebbe vedere questo chiuso come duplicato, anche, ma spero che ci sia una domanda migliore per il collegamento. – tripleee

risposta

14

È possibile utilizzare Perl per questo:

perl -ne 'print unless $seen{$_}++' file.txt 

L'interruttore -n rende processo Perl la linea di file per linea. Ogni riga ($_) è memorizzata come chiave in un hash denominato "visto", ma dal momento che ++ si verifica dopo aver restituito il valore, la riga viene stampata la prima volta che viene soddisfatta.

+0

Questo in un alias quando viene emesso un file> output.txt crea un file vuoto? alias RDL = "perl -ne 'print a meno che $ visto {$ _} ++' cleanList.txt> cleanList2.txt" root @ server:/tmp # RDL Impossibile modificare l'hash anonimo ({}) nel postincremento (++) at -e line 1, vicino a "} ++" Esecuzione di -e interrotta a causa di errori di compilazione. root @ server:/tmp # –

+0

Trovato questo gatto -n nome_file | ordina -uk2 | ordina -nk1 | cut -f2- a https://stackoverflow.com/questions/11532157/unix-removing-duplicate-lines-without-sorting –

+0

il comando 'uniq' funziona in un alias anche http://man7.org/linux/man -pages/man1/uniq.1.html –

34

Un modo utilizzando awk:

awk '!a[$0]++' file.txt 
+0

Non è possibile scrivere questo in un file tramite un alias proveniente da bashrc> output.txt ha solo una riga? –

+0

root @ server:/tmp # alias RDL = "awk '! A [\ $ 0] ++' cleanList.txt> cleanList2.txt" bash:! A [\ $ 0] ++ ': evento non trovato root @ server:/tmp # alias RDL = "awk '\! a [$ 0] ++' cleanList.txt> cleanList2.txt" root @ mdserver:/tmp # RDL awk: cmd. line: 1: \! a [bash] ++ awk: cmd. riga: 1:^backslash non ultimo carattere sulla riga root @ server:/tmp # alias RDL = "awk '\\! a [$ 0] ++' cleanList.txt> cleanList2.txt" ??? –

+0

Trovato questo gatto -n nome_file | ordina -uk2 | ordina -nk1 | cut -f2- a https://stackoverflow.com/questions/11532157/unix-removing-duplicate-lines-without-sorting –

Problemi correlati