awk比较两个以上的文件

时间:2014-12-24 08:58:23

标签: unix awk

想要将f11.txt和f22.txt的第一个字段($ 1)与f33.txt的第一个字段($ 1)进行比较,然后打印non-matching line items from 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

f33.txt的预期输出:

z,z

想要将f11.txt,f22.txt,f33.txt的第一个字段($ 1)与f44.txt的第一个字段($ 1)进行比较,然后打印non-matching line items from 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 f44.txt

f44.txt的预期输出:

m,n
b,a

寻找你的建议!!

1 个答案:

答案 0 :(得分:4)

这里有两种可能性:

  1. 首先阅读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 
    
  2. 使用参数

    中的最后一个文件名检查当前文件
    awk -F, '
        FILENAME != ARGV[ARGC-1] {keys[$1]; next} 
        !($1 in keys)
    ' f11.txt f22.txt f33.txt