awk 匹配两个文件中的第一个 3 列并打印文件 1 中的剩余部分

awk match 1st 3 columns from two files and print remainings from file1

你好,刚刚在匹配方面遇到了困难,并在论坛上尝试了几个匹配提示,但我无法应用它们中的任何一个,因为我需要比较文件 2 中的 $1、$2、$3 列和文件 1 中的列 $1、$2、 $3 如果匹配,则只打印 file1 中剩余的列以及 file2 中的列 欢迎任何有关 awk 代码描述的帮助

这不起作用:

awk 'NR == FNR { a[] = [=10=]; next } { line = a[] FS ; for(i = 2; i <= NF; ++i) line = line FS $i; print line }' file1 file2
awk 'NR==FNR{a[,,]=[=10=];next}(,,)in a{print a[,,]" | "[=10=]}' file1 file2

file1 包含

A 97276 X700 0 6 DD V8 2006
A 97276 X700 0 6 DD V8 2007
A 97276 X700 0 6 DD V8 2008
A 97276 X700 0 6 DD V8 2009
A 97276 X700 0 6 DD V8 2010
A 97276 X700 0 6 DD V8 2011
A 97276 X700 0 6 DD V8 2012
A 97276 X700 0 6 DD V8 2013
B 3254 A22 0 8 DD BIX 06
B 3254 A22 0 8 DD BIX 07
B 3254 A22 0 8 DD BIX 08
B 3254 A22 0 8 DD BIX 10
B 3254 A22 0 8 DD BIX 15
B 3254 A22 0 8 DD BIX 16
B 3254 A22 0 8 DD BIX 22
B 3254 A22 0 8 DD BIX 23
C 5554 L21 1 8 DD CDE 25
C 5554 L21 1 8 DD CDE 26
C 5554 L21 1 8 DD CDE 32
C 5554 L21 1 8 DD CDE 35
C 5554 L21 1 8 DD CDE 37 

文件2

A 97276 X700 MULTI.NOD 22:22 790 2097152 op 3 true 0 prev1 _xx fix
B 3254 A22 MULTI.NOD 11:14 15 1572864000 op 1 true 0 prev1 _xx fix
B 3254 A22 MULTI.NOD 11:15 16 524288640 op 1 true 0 prev1 _xx fix
B 3254 A22 MULTI.NOD 11:16 17 1572864000 op 1 true 0 prev1 _xx fix
C 5554 L21 MULTI.NOD 00:16 00 1572864000 op 1 true 0 prev2 _xx fix

输出应该是:

A 97276 X700 MULTI.NOD 22:22 790 2097152 op 3 true 0 prev1 _xx fix A 97276 X700 0 6 DD V8 2006
B 3254 A22 MULTI.NOD 11:14 15 1572864000 op 1 true 0 prev1 _xx fix B 3254 A22 0 8 DD BIX 06
B 3254 A22 MULTI.NOD 11:15 16 524288640 op 1 true 0 prev1 _xx fix B 3254 A22 0 8 DD BIX 07
B 3254 A22 MULTI.NOD 11:16 17 1572864000 op 1 true 0 prev1 _xx fix B 3254 A22 0 8 DD BIX 08
C 5554 L21 MULTI.NOD 00:16 00 1572864000 op 1 true 0 prev2 _xx fix C 5554 L21 1 8 DD CDE 25

例如。如果 file2 稍后如下

A 97276 X700 MULTI.NOD 17:4 790 2097152 op 3 true 0 prev1 _xx fix
A 97276 X700 MULTI.NOD 18:4 790 2097152 op 3 true 0 prev1 _xx fix
A 97276 X700 MULTI.NOD 19:4 790 2097152 op 3 true 0 prev1 _xx fix
A 97276 X700 MULTI.NOD 20:4 790 2097152 op 3 true 0 prev1 _xx fix
B 3254 A22 MULTI.NOD 11:11 15 1572864000 op 1 true 0 prev1 _xx fix
C 5554 L21 MULTI.NOD 00:16 00 1572864000 op 1 true 0 prev2 _xx fix
C 5554 L21 MULTI.NOD 00:44 00 1572864000 op 1 true 0 prev2 _xx fix
C 5554 L21 MULTI.NOD 00:88 00 1572864000 op 1 true 0 prev2 _xx fix

然后输出将是:

A 97276 X700 MULTI.NOD 17:4 790 2097152 op 3 true 0 prev1 _xx fix A 97276 X700 0 6 DD V8 2006
A 97276 X700 MULTI.NOD 18:4 790 2097152 op 3 true 0 prev1 _xx fix A 97276 X700 0 6 DD V8 2007
A 97276 X700 MULTI.NOD 19:4 790 2097152 op 3 true 0 prev1 _xx fix A 97276 X700 0 6 DD V8 2008
A 97276 X700 MULTI.NOD 20:4 790 2097152 op 3 true 0 prev1 _xx fix A 97276 X700 0 6 DD V8 2009
B 3254 A22 MULTI.NOD 11:11 15 1572864000 op 1 true 0 prev1 _xx fix B 3254 A22 0 8 DD BIX 06
C 5554 L21 MULTI.NOD 00:16 00 1572864000 op 1 true 0 prev2 _xx fix C 5554 L21 1 8 DD CDE 25
C 5554 L21 MULTI.NOD 00:44 00 1572864000 op 1 true 0 prev2 _xx fix C 5554 L21 1 8 DD CDE 26
C 5554 L21 MULTI.NOD 00:88 00 1572864000 op 1 true 0 prev2 _xx fix C 5554 L21 1 8 DD CDE 32
awk '
    FNR == 1 { delete count }
    { key =  SUBSEP  SUBSEP ; count[key]++ }
    FNR == NR { file1[key, count[key]] =  OFS  OFS  OFS  OFS ; next }
    { print [=10=], file1[key, count[key]] }
' file1 file2

这里的关键是记录key被看到的次数,这样就可以将file1中的数据与file2中的第n个key进行匹配。


代码多了一点,但是对于 file1 的布局更加灵活

awk '
    FNR == 1 { delete count }
    { key =  SUBSEP  SUBSEP ; count[key]++ }
    FNR == NR {
        data = ""
        for (i = 4; i <= NF; i++)
            data = data OFS $i
        file1[key, count[key]] = data
        next
    }
    { printf "%s%s%s", [=11=], file1[key, count[key]], ORS }
' file1 file2