Unix awk来比较两个以上的文件

Unix awk来比较两个以上的文件,unix,awk,Unix,Awk,要将f11.txt和f22.txt的第一个字段$1与f33.txt的第一个字段$1进行比较,然后从f33.txt打印不匹配的行项目 f11.txt a,b c,d f22.txt a,b x,x f33.txt a,b z,z 试过下面的命令并完成 awk ' BEGIN {FS = OFS = ","} FNR==NR {a[$1] = $0; next} !($1 in a) {print $0}' f11.txt f22.txt f33.txt awk ' BEGIN {FS =

要将f11.txt和f22.txt的第一个字段$1与f33.txt的第一个字段$1进行比较,然后从f33.txt打印不匹配的行项目

f11.txt

a,b
c,d
f22.txt

a,b
x,x
f33.txt

a,b
z,z
试过下面的命令并完成

awk ' BEGIN {FS = OFS = ","} FNR==NR {a[$1] = $0; next} !($1 in a) {print $0}'  f11.txt f22.txt f33.txt
awk ' BEGIN {FS = OFS = ","} FNR==NR {a[$1] = $0; next} !($1 in a) {print $0}'  f11.txt f22.txt f33.txt f44.txt
f33.txt的预期输出:

z,z
要将f11.txt、f22.txt、f33.txt的第一个字段$1与f44.txt的第一个字段$1进行比较,然后从f44.txt打印不匹配的行项目

其中f44.txt

m,n
x,y
b,a
试过下面的命令并完成

awk ' BEGIN {FS = OFS = ","} FNR==NR {a[$1] = $0; next} !($1 in a) {print $0}'  f11.txt f22.txt f33.txt
awk ' BEGIN {FS = OFS = ","} FNR==NR {a[$1] = $0; next} !($1 in a) {print $0}'  f11.txt f22.txt f33.txt f44.txt
f44.txt的预期输出:

m,n
b,a

期待你的建议

这里有两种可能性:

首先读取f33.txt,存储行,对于每个后续文件,删除存储的行

awk -F, '
    NR==FNR {f33[$1]=$0; next} 
    $1 in f33 {delete f33[$1]} 
    END {for (key in f33) print f33[key]}
' f33.txt f11.txt f22.txt 
使用参数中的最后一个文件名检查当前文件

awk -F, '
    FILENAME != ARGV[ARGC-1] {keys[$1]; next} 
    !($1 in keys)
' f11.txt f22.txt f33.txt 

nash_ag,上面的链接仅用于比较两个文件,因此我的问题不是重复的一个…您能否从第一种情况开始,使用cat f11 f22>f11_22,然后使用比较两个文件的技术?使用awk链接比较多个文件和列与上面的问题不同…Jas,我这样做只是因为Step1是cat f11 f22>f11_22,然后Step2是f11_f22 vs f33,好奇的是要避免两个步骤…为了避免两个步骤,您需要awk从第一个n-1文件构建索引,然后只从第n个最后一个文件打印不匹配的行。您当前的awk仅从第一个文件创建索引。非常感谢Glenn Jackman的支持,工作正常,我接受了答案并投了赞成票!!!