我正在使用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
答案 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