αԋɱҽԃ αмєяιcαη Asked: 2020-02-14 08:23:11 +0800 CST2020-02-14 08:23:11 +0800 CST 2020-02-14 08:23:11 +0800 CST 根据第一列比较 2 个文件并打印不匹配的 772 文件#1: test1,1 test2,2 test3 文件#2: test2 test1 test4 期望的输出: test4 awk sed 5 个回答 Voted Best Answer terdon 2020-02-14T09:17:22+08:002020-02-14T09:17:22+08:00 您可以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 Freddy 2020-02-14T09:12:41+08:002020-02-14T09:12:41+08:00 使用cut和grep: grep -F -x -v -f <(cut -d',' -f1 file1) file2 cut -d',' -f1 file1打印第一个字段file1并将grep输出用作模式输入文件(选项-f)。选项-F和-x用于匹配固定字符串和整行并-v反转匹配项。 francois P 2020-02-14T09:09:08+08:002020-02-14T09:09:08+08:00 :~$ 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 这只是我从示例列表中获得的一个示例,您可以使用它来解决您自己的需要。 bu5hman 2020-02-14T09:13:46+08:002020-02-14T09:13:46+08:00 awk假设第一个字段包含file1文件名并且字段分隔符始终是, awk -F"," 'NR==FNR{test[$1]=1}NR!=FNR{if (!test[$1]) print $1}' file1 file2 (见评论中@Terdon 精简版,然后结合我的 awk -F"," 'NR==FNR{test[$1]++}!test[$1]{print $1}' file1 file2 ) 替代使用join join -t, -v2 <(sort file1) <(sort file2) RudiC 2020-02-14T08:29:11+08:002020-02-14T08:29:11+08:00 对于这个设置, grep -ffile2 -v file1 test3 会做。但是 - 请注意例如需要采取额外措施的误报。
您可以
grep
为此使用:解释
grep
选项:因此,结合起来,
grep -vwf patternFile inputFile
意味着“从 patternFile 中找到那些在 inputFile 中永远不会作为整个单词出现的行”。<(command)
:这称为进程替换,在支持它的 shell(例如 bash)中,它本质上就像一个文件。这使我们能够将cut
命令的输出用作 grep-f
选项的“文件”。cut -d, -f1 file1
: 仅打印 file1 的第一个逗号分隔字段。请注意,您可能希望使用
-x
(匹配整行)而不是仅-w
当您的数据确实如您显示的那样:所以:
此外,如果您
file1
可以包含任何正则表达式字符(.
、等)*
,?
您可能还想使用-F
:所以:
使用
cut
和grep
:cut -d',' -f1 file1
打印第一个字段file1
并将grep
输出用作模式输入文件(选项-f
)。选项-F
和-x
用于匹配固定字符串和整行并-v
反转匹配项。这只是我从示例列表中获得的一个示例,您可以使用它来解决您自己的需要。
awk
假设第一个字段包含file1
文件名并且字段分隔符始终是,
(见评论中@Terdon 精简版,然后结合我的
)
替代使用
join
对于这个设置,
会做。但是 - 请注意例如需要采取额外措施的误报。