awk匹配两个文件中的前3列并打印文件1中的剩余内容

awk匹配两个文件中的前3列并打印文件1中的剩余内容,awk,match,multiple-columns,Awk,Match,Multiple Columns,大家好,刚刚在匹配中遇到了困难,在论坛上尝试了几个匹配提示,但我无法应用其中任何一个,因为我需要将file1中的file2列$1、$2、$3与列$1、$2、$3进行比较,如果存在匹配,只需打印file1中的剩余列以及file2中的列 欢迎提供有关awk代码说明的任何帮助 这不起作用: awk 'NR == FNR { a[$2] = $0; next } { line = a[$2] FS $1; for(i = 2; i <= NF; ++i) line = line FS $i; pr

大家好,刚刚在匹配中遇到了困难,在论坛上尝试了几个匹配提示,但我无法应用其中任何一个,因为我需要将file1中的file2列$1、$2、$3与列$1、$2、$3进行比较,如果存在匹配,只需打印file1中的剩余列以及file2中的列 欢迎提供有关awk代码说明的任何帮助

这不起作用:

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

输出应为:

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
例如,如果文件2将按以下方式更新

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
这里的关键是记录该键被看到的次数,这样您就可以将来自file1的数据与来自file2的第n个键进行匹配


这是一个稍微多一点的代码,但是对于file1的布局来说更灵活

awk '
    FNR == 1 { delete count }
    { key = $1 SUBSEP $2 SUBSEP $3; 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", $0, file1[key, count[key]], ORS }
' file1 file2
awk'
FNR==1{删除计数}
{key=$1 subsp$2 subsp$3;count[key]+}
FNR==NR{
data=“”
对于(i=4;i
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 = $1 SUBSEP $2 SUBSEP $3; count[key]++ }
    FNR == NR { file1[key, count[key]] = $4 OFS $5 OFS $6 OFS $7 OFS $8; next }
    { print $0, file1[key, count[key]] }
' file1 file2
awk '
    FNR == 1 { delete count }
    { key = $1 SUBSEP $2 SUBSEP $3; 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", $0, file1[key, count[key]], ORS }
' file1 file2