文件#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)中,它本质上就像一个文件。这使我们能够将命令的输出用作cut
grep 选项的“文件”-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
使用cut
和grep
:
grep -F -x -v -f <(cut -d',' -f1 file1) file2
cut -d',' -f1 file1
打印第一个字段file1
并grep
使用输出作为模式输入文件(选项-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
会做。但是 - 请注意误报等情况,这需要采取额外的措施。