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
你好,刚刚在匹配方面遇到了困难,并在论坛上尝试了几个匹配提示,但我无法应用它们中的任何一个,因为我需要比较文件 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