数组中的模式匹配

时间:2014-03-28 10:08:39

标签: awk

我想根据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]

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