Awk 阵列内的模式匹配

Awk 阵列内的模式匹配,awk,Awk,我想根据fileB中的单个字段与fileA中的四个字段中的任何一个字段之间的模式匹配(尽管匹配将是fileA中这些字段中数组的第一个元素),使用fileB中的数据更新fileA中的行 fileA如下所示$3$4$5$6是我正在搜索匹配项的字段,这些字段可以是“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.7

我想根据fileB中的单个字段与fileA中的四个字段中的任何一个字段之间的模式匹配(尽管匹配将是fileA中这些字段中数组的第一个元素),使用fileB中的数据更新fileA中的行

fileA如下所示$3$4$5$6是我正在搜索匹配项的字段,这些字段可以是“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
匹配将在$3的fileB和$3 | |$4 | | |$5 | |$6的fileA数组的第一个元素之间,输出如下所示。它基本上是fileA,带有一个新字段$7,即$1:$2:$4,如果有匹配项,则来自fileB,如果没有匹配项,则为“NM”

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]
这应该起作用:

$ 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
$awk'
NR==FNR{
a[$3]=$1:“$2:”$4
下一个
}
{
n=拆分($0,tmp,/[:]/)

对于(x=1;x)你尝试了什么?它是如何不起作用的?@ZsoltBotykai我编辑了这个问题,将我一直试图缝合在一起的部分包括在内。这是完美的,谢谢。如果不匹配,它没有添加“NM”,但我可以在以后用awk'{if(NF==6){$0=$1'\t$2'\t$3'\t$4'\t$5'\t$6'\t'编辑这个问题“NM”;};print$0}@user1308144哦,糟糕,我没有看到额外的
NM
。检查更新的解决方案。
$ 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