我正在寻找一个命令或脚本来执行以下操作 - 给出:
文件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
,我们正在寻找子字符串而不是匹配正则表达式。
因为一旦找到匹配项,我们就会从数组中删除该单词,因此可以避免不必要的搜索。