使grep打印缺少查询

时间:2016-06-01 15:06:27

标签: grep

我正在使用grep -f并且想要在文件1中使用grep打印文件2中缺少的行:

文件1:

hello
my
name
is
bernardo

文件2:

hello 1
my 2
name 3
is 4

理想输出:

hello 1
my 2
name 3
is 4
bernardo

2 个答案:

答案 0 :(得分:1)

这将打印file2中不在file1中的行:

fgrep -F -x -v -f file1 file2

-F表示将输入视为固定字符串而不是模式,-x表示匹配整行,-v表示打印不匹配的行而不是匹配的行,-f file1使用file1作为模式列表。

你的问题有点不清楚,但我猜你想要出现在一个或另一个文件中的所有行,但不是两个。有几种方法可以做到这一点。一个是做两个greps:

fgrep -F -x -v -f file2 file1; fgrep -F -x -v -f file1 file2

另外,如果输出中的行顺序无关紧要,则进行排序 他们并使用comm:

sort file1 -o sortfile1
sort file2 -o sortfile2
comm -3 sortfile1 sortfile2

答案 1 :(得分:0)

grep -f file1 file2 && grep -o -f file1 file2 | sed s'/^\(.*\)$/-e "\1"/g' | tr '\n' ' ' | xargs grep -v file1

这样做是通过 file1 中的模式打印 file2 的所有匹配项,然后打印 file1 中所有不匹配的行 file2 中的文件。第二部分完成如下:

  • grep -o -f file1 file2返回 file file2 之间的匹配,但只返回行的匹配部分;
  • sed s'/^\(.*\)$/-e "\1"/g' | "\1"/g' | tr '\n' ' '将这些匹配的部分作为-e的前缀,用双引号括起来,并用空格替换grep -f命令打印的换行符。这会构建一个-e "[pattern1]" -e "[pattern2]" ...形式的字符串,这是grep用于多个模式匹配的形式。引号(希望)确保模式中的空格不会成为问题;
  • xargs grep -v file1构建并执行命令grep -v file1 [whatever was piped to xargs]。结果是来自 file1 的所有行在第一个命令的输出中都不匹配(因此,在 file2 中)。

我不能完全确定这会解决您的问题,因为 file1 的不匹配行会在最后打印(到目前为止最简单的选项),而您没有说出您想要的位置他们。它也许可以更优雅地完成。

这是一个示例输出:

sh-4.3$ cat file1
hello
my
name
is
bernardo

sh-4.3$ cat file2
hello 1
my 2
name 3
is 4

sh-4.3$ grep -f file1 file2 && grep -o -f file1 file2 | sed s'/^\(.*\)$/-e "\1"/g' | tr '\n' ' ' | xargs grep -v file1
hello 1
my 2
name 3
is 4
bernardo