2012-07-10 55 views
1

在另一個文件由列的部分替換文件中的特定專欄中,我有兩個輸入文件作爲需要幫助的Unix

文件1:

ABC:client1:project1 
XYZ:client2-aa:project2 
DEF:client4:proj 

文件2:

client1:W-170:xx 
client2-aa:WT-04:yy 
client4:L-005A:zz 

另外,有效值數組可以像[W,WT]一樣硬編碼。

輸出:

ABC:W:project1 
XYZ:WT:project2 

因此,基本上,如果file1的第2列與file2中的任何記錄的第1列匹配,則將file1中的第2列的一部分替換爲file1中的coulmn2。 爲了獲得這部分,我需要使用「 - 」運算符分割file2中的column2,並將結果與​​數組匹配以確定有效值。

對於不符合上述標準的記錄,它們不應顯示在輸出中。

我是shell腳本編程新手,非常感謝您的幫助。 我一直因爲一兩天的努力,並使用

awk -F":" 'NR==FNR{A[$1]=$2;next}$2 in A{$2=A[$2]}1' OFS=":" file2 file1. 

但是已經能夠代替整列,一直沒能得到柱要求工作的一部分。

回答

2

你非常接近。這裏是awk代碼,您正在尋找,使用split功能:

awk ' 
    BEGIN { OFS=FS=":" } 
    NR==FNR { split ($2,one,"-"); two[$1] = one[1]; next } 
    $2 in two { $2 = two[$2]; print } 
' file2 file1 

輸出:

ABC:W:project1 
XYZ:WT:project2 
DEF:L:proj 
0

這可能爲你工作(GNU SED):

sed 's/^\([^:]*:\)\([^-]*\).*/s|:\1|:\2:|p/' file2 | sed -nf - file1 

說明:

  • sed 's/^\([^:]*:\)\([^-]*\).*/s|:\1|:\2:|p/' file2做一個sed腳本來做替換。
  • sed -nf - file1它管道到另一個sed實例,並運行對意文件

注:我不明白"Also, array of valid values can be hardcoded like [W,WT]"所以這可能不完全適合您的需求。