我想根据fileB中单个字段与fileA中四个字段中的任何一个字段之间的模式匹配,使用fileB中的数据更新fileA中的行(尽管匹配将是fileA中这些字段中数组的第一个元素)。
fileA如下所示。 $ 3 $ 4 $ 5 $ 6是我正在寻找比赛的领域,这些可以是" NM"或由"分隔的三个元素的数组:"
H01 x001 NM NM NM NM
H01 f005 NM s10|001:60:50 NM s10|001:500:709
H06 x989 NM NM NM s560|999:70:500
H79 r679 s560|999:1000:1100 NM NM NM
fileB如下所示。
POI05 A s50|088 85.77
POI15 A s10|001 65.09
POI45 B s8970|0753 85.37
POI55 B s900|08 8.77
POI75 C s560|999 55.82
POI81 C s33|0008 5.88
匹配将在fileB的$ 3和$ 3 ||的数组的第一个元素之间4美元|| 5美元|| fileA $ 6,输出如下所示。它基本上是fileA,当有一个匹配或者" NM"它是一个新字段$ 7,$ 1:$ 2:$ 4来自fileB。什么时候没有比赛。
H01 x001 NM NM NM NM NM
H01 f005 NM s10|001:60:50 NM s10|001:500:709 POI15:A:65.09
H06 x989 NM NM NM s560|999:70:500 POI75:C:55.82
H79 r679 s560|999:1000:1100 NM NM NM POI75:C:55.82
如上例所示,fileA中的fileB $ 2可以有多个匹配。
我一直试图做的事情:
我昨天获得了相关问题的帮助,但它缺乏(a)匹配在数组中的复杂性,以及(B)匹配包含在四个字段中的任何一个。
awk 'NR==FNR{a[$3]=$1":"$2":"$4;next}{$7=(a[$2])?a[$2]:"NM"}1'
我需要将数组拆分为$ 3 $ 4 $ 5 $ 6的fileA并提取每个元素的第一个元素
split($3, arr, ":") $3[1]
答案 0 :(得分:4)
这应该有效:
$ awk '
NR==FNR {
a[$3] = $1":"$2":"$4
next
}
{
n = split($0, tmp, /[: ]/)
for(x=1; x<=n; x++) {
if(a[tmp[x]]) {
print $0 FS a[tmp[x]]
next
}
}
print $0,"NM"
}' fileb filea
H01 x001 NM NM NM NM NM
H01 f005 NM s10|001:60:50 NM s10|001:500:709 POI15:A:65.09
H06 x989 NM NM NM s560|999:70:500 POI75:C:55.82
H79 r679 s560|999:1000:1100 NM NM NM POI75:C:55.82