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



嗨只是在匹配方面遇到了困难,并在论坛上尝试了几个匹配提示,但我无法应用其中任何一个,因为我只需要比较 File2 列 $1,$2,$3 来自 file1 的列与列 $1,$2,$3 如果有匹配,只需打印文件1中的剩余列以及文件2中的列 欢迎任何有关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

文件 1 包含

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 = $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

这里的关键是记录密钥被看到的次数,以便您可以将 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

最新更新