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.
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 ...........
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.
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
Sie können auch die -w
Flagge verwenden, von uniq
der 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 1
den 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 grep
fü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