使grep打印缺少的查询

使grep打印缺少的查询,grep,Grep,我正在使用grep-f,并希望使grep打印文件1中的行在文件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中不在文件1中的行: fgrep -F -x -v -f file1 file2 -F表示将输入视为固定字符串而不是模式,-x表示匹配整行,-v表示打印不匹配的行而不是匹配的行,-F file1使用fi

我正在使用grep-f,并希望使grep打印文件1中的行在文件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中不在文件1中的行:

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

这将打印文件2中不在文件1中的行:

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
这样做的目的是按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[通过管道传输到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
这样做的目的是按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[通过管道传输到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

据我所知,OP希望打印
file2
中与
file1
中的行匹配的行,以及
file1
中与
file2
中不匹配的行,OP希望打印
file2
中与
file1
中的行相匹配的行,以及
file1
中与
file2
中不匹配的行。请分享您迄今为止所做/尝试的工作!请分享您迄今为止所做/尝试的内容!