“Ungrep” - 哪些模式不匹配

“Ungrep” - 哪些模式不匹配

我正在寻找一个命令或脚本来执行以下操作 - 给出:

文件1.txt:

abcd
efgh 
ijkl
mnop

文件2.txt:

123abcd123
123efgh123
123mnop123

我想要一个执行类似操作的命令:

ungrep file1.txt file2.txt

并返回以下内容:

ijkl

换句话说,它给我的 file1.txt 中的行不会在 file2.txt 的 grep 上返回任何结果。我知道我可以通过迭代 file1.txt,为每一行 grep file2.txt 并存储结果,并输出结果为空的任何行来做到这一点,但我希望有一种更有效的方法来做到这一点。

答案1

对于 GNU,grep以下应该可以工作。使用该-f选项,file1.txt作为“模式文件”传递 - 但也可以作为数据文件第二次传递。用于-o仅报告匹配的部件。最后提取那些只匹配一次的单词 - 这些单词对应于file1.txt在 中找不到匹配项的行file2.txt

grep -h -o -f  file1.txt file2.txt file1.txt | sort | uniq -u
ijkl

答案2

你可以这样做awk

awk '
  NR == FNR {w[$0]; next}
  {for (i in w) if (index($0,i)) delete w[i]}
  END {for (i in w) print i}' file1.txt file2.txt

通过使用index,我们正在寻找子字符串而不是匹配正则表达式。

因为一旦找到匹配项,我们就会从数组中删除该单词,因此可以避免不必要的搜索。

相关内容