2014-03-28 50 views
3

我想根據fileB中的單個字段與fileA中的任意四個字段之間的模式匹配來更新fileA中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 

匹配將會在$ 3的fileB和$ 3 ||數組的第一個元素之間$ 4 || $ 5 || fileA的6美元,輸出將如下所示。基本上,fileA有一個新的字段$ 7,當匹配時是fileB,$ 1:$ 2:$ 4,沒有匹配時是「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可以有多個匹配項。

我一直在努力做的事情:

我昨天得到幫助的相關問題,但它缺乏(一)比賽是一個數組中,和(B)的匹配被包含在任何的複雜性四個領域。

awk 'NR==FNR{a[$3]=$1":"$2":"$4;next}{$7=(a[$2])?a[$2]:"NM"}1' 

我需要拆分爲$ 3 $ $ 4 5的fileA的$ 6陣列和提取的每個

split($3, arr, ":") $3[1] 
+0

和你有什麼試過沒?那它怎麼沒用? –

+0

@ZsoltBotykai我編輯了這個問題,包括我一直試圖縫合在一起的棋子 – user1308144

回答

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 
+0

這是完美的,謝謝。在不匹配的情況下,它沒有添加「NM」,但是我可以用awk'{if(NF == 6){$ 0 = $ 1「\ t」$ 2「\ t」$ 3「\ t」 $ 4「\ t」$ 5「\ t」$ 6「\ t」「NM」;};打印$ 0}' – user1308144

+1

@ user1308144哦,我的壞,我沒有看到額外的'NM'。檢查更新的解決方案。 –