it-swarm.it

Come ottenere solo risultati unici senza dover ordinare i dati?

$ cat data.txt 
aaaaaa
aaaaaa
cccccc
aaaaaa
aaaaaa
bbbbbb
$ cat data.txt | uniq
aaaaaa
cccccc
aaaaaa
bbbbbb
$ cat data.txt | sort | uniq
aaaaaa
bbbbbb
cccccc
$

Il risultato di cui ho bisogno è visualizzare tutte le righe dal file originale rimuovendo tutti i duplicati (non solo quelli consecutivi), mantenendo l'ordine originale delle istruzioni nel file.

Qui, in questo esempio, il risultato che stavo effettivamente cercando era

aaaaaa
cccccc
bbbbbb

Come posso eseguire questa operazione generalizzata uniq in generale?

43
Lazer
Perl -ne 'print unless $seen{$_}++' data.txt

Oppure, se devi avere un so inutile di cat :

cat data.txt | Perl -ne 'print unless $seen{$_}++'

Ecco una traduzione di awk, per i sistemi che non dispongono di Perl:

awk '!seen[$0]++' data.txt
cat data.txt | awk '!seen[$0]++'
57
cjm

john ha uno strumento chiamato unique:

[email protected] % cat data.txt | unique out
[email protected] % cat out
aaaaaa
cccccc
bbbbbb

Ottenere lo stesso senza strumenti aggiuntivi in ​​una singola riga di comando è un po 'più complesso:

[email protected] % cat data.txt | nl | sort -k 2 | uniq -f 1 | sort -n | sed 's/\s*[0-9]\+\s\+//'
aaaaaa
cccccc
bbbbbb

nl stampa i numeri di riga davanti alle linee, quindi se sort/uniq dietro di loro, possiamo ripristinare l'ordine originale delle linee. sed elimina solo i numeri di riga in seguito;)

13
binfalse

Preferisco usare questo:

cat -n data.txt | sort --key=2.1 -b -u | sort -n | cut -c8-

cat -n aggiunge numeri di riga,

sort --key=2.1 -b -u ordina sul secondo campo (dopo i numeri di riga aggiunti), ignorando gli spazi vuoti iniziali, mantenendo linee univoche

sort -n ordina in stretto ordine numerico

cut -c8- conserva tutti i caratteri dalla colonna 8 a EOL (ovvero ometti i numeri di riga inclusi)

6
menkus

Perl ha un modulo che puoi usare che include una funzione chiamata uniq. Quindi, se hai caricato i tuoi dati in un array in Perl, devi semplicemente chiamare la funzione in questo modo per renderlo unico, mantenendo comunque l'ordine originale.

use List::MoreUtils qw(uniq)    
@output = uniq(@output);

Puoi leggere ulteriori informazioni su questo modulo qui: Elenco :: MoreUtils

2
slm