Rimuovi le righe in base ai duplicati all'interno di una colonna senza ordinamento


30

Ho file di 3 colonne di grandi dimensioni (~ 10.000 righe) e vorrei rimuovere le righe quando il contenuto della terza colonna di quella riga appare nella terza colonna di un'altra riga. Le dimensioni dei file rendono l'ordinamento un po 'ingombrante e non posso usare qualcosa come il codice qui sotto perché le intere righe non sono identiche; solo il contenuto della colonna 3.

awk '!seen[$0]++' filename

Risposte:


31

Basta cambiare il comando awk nella colonna che si desidera eseguire per rimuovere le linee duplicate in base (nel terzo caso alla colonna):

awk '!seen[$3]++' filename

Questo comando indica awkquali linee stampare. La variabile $3contiene l'intero contenuto della colonna 3 e le parentesi quadre sono l'accesso alla matrice. Pertanto, per ogni terza colonna di riga nel nome file, il nodo dell'array denominato seenviene incrementato e la riga viene stampata se il contenuto di quel nodo (colonna3) non era ( !) precedentemente impostato.

Il awkcomando sopra funzionerà se le tue colonne nel file di input sono delimitate con spaceo Tabtra di loro, se le colonne delimitate con qualcos'altro, devi dirgli di awk con la sua -Fopzione. Quindi, ad esempio se tutte le colonne delimitate da virgola ( ,) e vogliono rimuovere le righe di base -F','sull'opzione di utilizzo della terza colonna .

awk -F',' '!seen[$3]++' filename

18

sortil comando è già ottimizzato per gestire file di grandi dimensioni. Quindi, potresti benissimo usare il sortcomando sul tuo file come

sort -u -t' ' -k3,3 file
  • -u - stampa solo le linee uniche.
  • -t- specifica il delimitatore. Qui in questo esempio, utilizzo semplicemente lo spazio come delimitatore.
  • -k3,3 - ordina sul 3 ° campo.

Si potrebbe fare riferimento a questa risposta che suggerisce che l'ordinamento GNU è in realtà l'approccio migliore per l'ordinamento di file di grandi dimensioni. Nel tuo caso, penso anche senza -parallel, potresti ottenere il tuo risultato finale senza molto ritardo.


Stava per commentare in modo offensivo che -uavrebbe rimosso solo le righe duplicate , non le chiavi duplicate ... ma mi sbaglio.
Randoms,

@Ramesh fa il lavoro ma l'ordinamento cambia la sequenza di linee che immagino non mi aspettassi sempre.
Bharat,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.