根据第一列比较2个文件并打印不匹配的

根据第一列比较2个文件并打印不匹配的

文件#1:

test1,1
test2,2
test3

文件#2:

test2
test1
test4

期望的输出:

test4

答案1

您可以grep为此使用:

$ grep -vwf <(cut -d, -f1 file1) file2
test4

解释

  • grep选项:

    -v, --invert-match
          Invert the sense of matching, to select non-matching lines.
    -w, --word-regexp
          Select  only  those  lines  containing  matches  that form 
          whole words.  
    -f FILE, --file=FILE
          Obtain patterns from FILE, one per line.  
    

    因此,组合起来grep -vwf patternFile inputFile意味着“从patternFile中查找那些在inputFile中永远不会作为整个单词出现的行”。

  • <(command):这称为进程替换,在支持它的 shell(例如 bash)中,它本质上就像一个文件。这使我们能够将命令的输出用作cutgrep 选项的“文件” -f

  • cut -d, -f1 file1:仅打印 file1 的第一个逗号分隔字段。

请注意,您可能想要使用-x(匹配整行),而不是仅-w当您的数据确实如您所显示的那样:

  -x, --line-regexp
          Select  only  those  matches  that exactly match the whole line.

所以:

$ grep -vxf <(cut -d, -f1 file1) file2
test4

另外,如果您file1可以包含任何正则表达式字符(.*?),您可能还想使用-F

  -F, --fixed-strings
          Interpret PATTERNS as fixed strings, not regular expressions.

所以:

$ grep -Fvxf <(cut -d, -f1 file1) file2
test4

答案2

使用cutgrep

grep -F -x -v -f <(cut -d',' -f1 file1) file2

cut -d',' -f1 file1打印第一个字段file1grep使用输出作为模式输入文件(选项-f)。选项-F-x用于匹配固定字符串和整行并-v反转匹配。

答案3

:~$ cat > toto
a b
c d
e f
:~$ cat > titi
a b
d e
f g
:~$ awk 'NR==FNR{c[$1]++;next};c[$1] == 0' toto titi
d e
f g

这只是我从示例列表中获得的一个示例,您可以使用它来解决您自己的需求。

答案4

对于这个设置,

grep -ffile2 -v file1
test3

会做。但是 - 请注意误报等情况,这需要采取额外的措施。

相关内容