我有一个包含 2 列的文件,如下所示:
apple pear
banana pizza
spoon fork
pizza plate
sausage egg
如果一个单词出现在多行中,我想删除重复单词出现的所有行,如您所见,“pizza”出现了两次,因此应删除 2 行,以下是所需的输出:
apple pear
spoon fork
sausage egg
我知道使用:
awk '!seen[$1]++'
但是,这只在字符串出现在一列中时删除行,我需要一个命令来检查两列。我怎样才能做到这一点?
答案1
基本的两步方法是创建一个非唯一单词列表,并将其通过管道传输到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