[英]show only matched strings - grep
我有两个文件。 File1如下
Apple
Cat
Bat
File2如下
I have an Apple
Batman returns
This is a test file.
现在我想检查第一个文件中哪些字符串不在第二个文件中。 我可以做一个grep -f file1 file2
但是那给了我第二个文件中匹配的行。
要获取第一个文件和第二个文件中的字符串:
grep -of file1 file2
结果(使用给定的示例)将是:
Apple
Bat
要获取第一个文件中但不在第二个文件中的字符串,您可以:
grep -of file1 file2 | cat - file1 | sort | uniq -u
甚至更简单(感谢@ triplee的评论):
grep -of file1 file2 | grep -vxFf - file1
结果(使用给定的示例)将是:
Cat
从grep
手册页:
-o , - 只匹配
仅打印匹配行的匹配(非空)部分,每个此类部分位于单独的输出行上。
从uniq
手册页:
-u , - 唯一
仅打印唯一的线条
如果你想显示file1中不在file2中的单词,那么一种肮脏的方式就是循环遍历单词和grep。 如果不匹配,请打印单词:
while read word
do
grep -q "$word" f2 || echo "$word"
done < f1
要匹配确切的单词,请添加-w
: grep -wq
...
$ while read word; do grep -q "$word" f2 || echo "$word"; done < f1
Cat
$ while read word; do grep -wq "$word" f2 || echo "$word"; done < f1
Cat
Bat
更好的方法是使用awk:
$ awk 'FNR==NR {a[$1]; next} {for (i=1;i<=NF;i++) {if ($i in a) delete a[$i]}} END {for (i in a) print i}' f1 f2
Cat
Bat
这会将file1中的值存储到数组a[]
。 然后,它循环遍历file2的所有行,检查每个元素。 如果其中一个匹配数组a[]
中的值,则从数组中删除此元素。 最后,在END{}
块中打印未找到的值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.