当字符串出现在多行中时,如何从文件中删除行?

Jon*_*y P 1 sorting bash awk sed

我有一个具有2列的文件,如下所示:

apple pear
banana pizza
spoon fork
pizza plate
sausage egg
Run Code Online (Sandbox Code Playgroud)

如果一个单词出现在多行中,我想删除重复出现的单词的所有行,如您所见,“比萨饼”出现了两次,因此应删除2行,以下是必需的输出:

apple pear
spoon fork
sausage egg
Run Code Online (Sandbox Code Playgroud)

我知道使用:

awk '!seen[$1]++' 
Run Code Online (Sandbox Code Playgroud)

但是,这仅在字符串出现在一列中时才删除行,我需要一条将检查两列的命令。我怎样才能做到这一点?

Soc*_*owi 5

您可以使用grep和来分多个步骤解决问题uniq -d

首先,使用生成所有单词的列表grep -Eo '[^ ]+'。然后过滤该列表,以便仅保留重复的单词。可以使用进行过滤… | sort | uniq -d。最后,从先前使用生成的列表中打印不包含任何单词的所有行grep -Fwvf listFile inputFile

bash所有这些步骤可以在一个单一的命令来运行。在这里,我们将使用变量$in使其易于适应。

in="path/to/your/input/file"
grep -Fwvf <(grep -Eo '[^ ]+' "$in" | sort | uniq -d) "$in"
Run Code Online (Sandbox Code Playgroud)