web-dev-qa-db-ja.com

重複する単語を含む行を削除する

私はこのような行でソートされたファイルを持っています

Word1  abca
Word1  abcb
Word1  abcc
Word2  abca
Word2  abcb
Word3  abbb
...........

そして私はこのようなものが欲しい

Word1  abca
Word2  abca
Word3  abbb
...........
1
anon123

この魔法の呪文は有名なawkのイディオムです。

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

その$ 1の行が初めて表示されると、その行が印刷されます。

4
glenn jackman

Awkソリューション-変数を使用して新しいWordを検出します。新しいWordが見つかった場合は、その行を印刷して、変数を現在のWordに割り当てます。

データファイルがソートされると、各Wordの最初の出現のみがレコードを印刷します。

   awk 'BEGIN{w=""} w!=$1 {print;w=$1}' your-file
1
suspectus

uniq-wフラグを使用して、最初のN文字のみを比較するように指示することもできます。これが機能するかどうかの詳細は実際のデータによって異なりますが、Wordの長さが設定または制限されている場合は、機能するはずです。

$ sort file.txt | uniq -w 5
Word1  abca
Word2  abca
Word3  abbb

または、フィールドの順序を逆にして、uniq -f 1を使用して、最初のフィールドの比較をスキップします。

$ awk '{print $2,$1}' file.txt | uniq -f 1 | awk '{print $2,$1}'
Word1 abca
Word2 abca
Word3 abbb

または、最初のフィールドを取得してからgrepを取得し、検索を最初の一致に制限します。

$ for i in $(awk '{print $1}' file.txt | sort -u); do grep -m 1 $i file.txt; done
Word1  abca
Word2  abca
Word3  abbb

そして、完成のために、Perlのもの:

$ Perl -ane 'print if $k{$F[0]}++<1' file.txt 
Word1  abca
Word2  abca
Word3  abbb
0
terdon