2010-04-08 28 views
13

Cercare un awk (o sed) one-liner per rimuovere le righe dall'output se il primo campo è un duplicato.Rimuovi riga se il campo è duplicato

Un esempio per la rimozione di righe duplicate che ho visto è:

awk 'a !~ $0; {a=$0}' 

provato ad utilizzare per una base senza fortuna (ho pensato cambiando il $ 0 a $ 1 di di farebbe il trucco, ma non sembra funzionare).

+0

hai chiesto di rimuovere le linee 'se le prime partite di campo' ... che cosa? Ho assunto "lo stesso valore del primo campo in alcune linee di input precedenti"; un'altra persona ha assunto "qualche schema particolare". Cosa intendevi? –

+0

La tua versione modificata 'awk 'a! ~ $ 1; {a = $ 1} ''* funziona per me * per i duplicati adiacenti (ad esempio un file ordinato). ** La versione ** di Jonathan Leffler ha il vantaggio che funzionerà per rimuovere i duplicati su un file non ordinato, ma a spese della creazione di un array potenzialmente grande. –

+0

Penso che il mio problema principale fosse che avevo a che fare con alcuni tipi diversi di separatori di campo e che non stavo definendo correttamente il sistema operativo. – Kyle

risposta

25
awk '{ if (a[$1]++ == 0) print $0; }' "[email protected]" 

Questo è un uso standard (molto semplice) per gli array associativi.

+0

Che funzionava! Ho avuto un altro bug che non mi ero reso conto che poteva darmi dei problemi. Grazie! – Kyle

8

questo è come rimuovere i duplicati

awk '!_[$1]++' file 
+2

L'uso di '_' come il nome dell'array invita a fraintendere, ma funziona. –

1

Se siete aperti ad usare Perl:

perl -ane 'print if ! $a{$F[0]}++' file 

-a autosplits la linea nella @F matrice, che è indicizzato a partire da 0
L'hash %a ricorda se il primo campo è già stato visto


Questa soluzione relativa presuppone che il separatore di campo è una virgola, piuttosto che spazi

perl -F, -ane 'print if ! $a{$F[0]}++' file 
Problemi correlati