Zeilen mit doppelten Wörtern entfernen

2578
anon123

Ich habe eine sortierte Datei mit solchen Zeilen

word1 abca word1 abcb word1 abcc word2 abca word2 abcb word3 abbb ........... 

und ich möchte so etwas haben

word1 abca word2 abca word3 abbb ........... 
1
Sie müssen weitere Details angeben. Benötigen Sie nur den ersten Eintrag für jedes Wort1, Wort2 ...? Gh0sT vor 10 Jahren 0
Es ist egal, ob es sich um den ersten oder den zweiten oder den nächsten Eintrag handelt, und es muss nur eine Zeile mit word1 oder word2 etc sein anon123 vor 10 Jahren 0

3 Antworten auf die Frage

3
glenn jackman

Diese magische Beschwörung ist ein berühmtes Sprichwort:

awk '!seen[$1]++' file 

Wenn zum ersten Mal eine Zeile mit diesem $ 1 angezeigt wird, wird die Zeile gedruckt.

1
suspectus

Eine awk-Lösung - Verwenden einer Variablen zum Erkennen eines neuen Wortes. Wenn ein neues Wort gefunden wird, drucken Sie die Zeile und weisen Sie die Variable dem aktuellen Wort zu.

Da die Datendatei sortiert ist, wird der Datensatz nur beim ersten Vorkommen jedes Wortes gedruckt.

 awk 'BEGIN w!=$1 ' your-file 
0
terdon

Sie können auch die -wFlagge verwenden, von uniqder Sie erfahren, dass nur die ersten N-Zeichen verglichen werden. Die Details, ob dies für Sie funktioniert, hängen von Ihren tatsächlichen Daten ab. Wenn jedoch die Wortlänge festgelegt oder begrenzt ist, sollte dies funktionieren:

$ sort file.txt | uniq -w 5 word1 abca word2 abca word3 abbb 

Alternativ können Sie die Reihenfolge der Felder umkehren und uniq -f 1den Vergleich des 1. Feldes überspringen:

$ awk '' file.txt | uniq -f 1 | awk '' word1 abca word2 abca word3 abbb 

Oder holen Sie sich die ersten Felder und dann grepfür sie und beschränken Sie die Suche auf den ersten Treffer:

$ for i in $(awk '' file.txt | sort -u); do grep -m 1 $i file.txt; done word1 abca word2 abca word3 abbb 

Und zur Vervollständigung ein Perl:

$ perl -ane 'print if $k{$F[0]}++<1' file.txt  word1 abca word2 abca word3 abbb