文字列が複数行に現れるときにファイルから行を削除する方法は?

文字列が複数行に現れるときにファイルから行を削除する方法は?

次の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

関連情報