次の2つの列を持つファイルがあります。
apple pear
banana pizza
spoon fork
pizza plate
sausage egg
複数の行に単語が表示されたら、重複した単語が表示されているすべての行を削除したいと思います。ご覧のとおり、「pizza」が2回表示されるため、2行を削除する必要があります。以下は希望の出力です。
apple pear
spoon fork
sausage egg
私は次の方法を知っています:
awk '!seen[$1]++'
ただし、文字列が 1 つの列に表示される場合にのみ行が削除されるため、両方の列を確認するコマンドが必要です。どうすればいいですか?
答え1
基本的な2段階のアプローチは、ユニークでない単語のリストを作成し、それをgrep -v
。
sort
最初の部分では、and uniq -d
(単語をシリアライズしてから - おそらくwith tr
)または - 続けて使用するには、awk
次のように使用できます。
awk -vRS='[ \t\n]' 'seen[$0]++' file
分割記録余白に入れて印刷する持つ以前見たことがあります。だから
$ awk -vRS='[ \t\n]' 'seen[$0]++' file | grep -Fvf- file
apple pear
spoon fork
sausage egg
答え2
次のコマンドを試してください
for i in `cat filename| perl -pne "s/ /\n/g"| sort| uniq`; do j=`grep -c $i p.txt`; if [[ $j -eq 2 ]]; then sr=`echo $i`; else sed -n '/'$i'/p' p.txt| sed -n '/'$sr'/!p'; fi; done| awk '{if (!seen[$0]++)print $0}'
出力
apple pear
sausage egg
spoon fork