私はこのような行でソートされたファイルを持っています
Word1 abca
Word1 abcb
Word1 abcc
Word2 abca
Word2 abcb
Word3 abbb
...........
そして私はこのようなものが欲しい
Word1 abca
Word2 abca
Word3 abbb
...........
この魔法の呪文は有名なawkのイディオムです。
awk '!seen[$1]++' file
その$ 1の行が初めて表示されると、その行が印刷されます。
Awkソリューション-変数を使用して新しいWordを検出します。新しいWordが見つかった場合は、その行を印刷して、変数を現在のWordに割り当てます。
データファイルがソートされると、各Wordの最初の出現のみがレコードを印刷します。
awk 'BEGIN{w=""} w!=$1 {print;w=$1}' your-file
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