2016-02-29 31 views
0

文件1是替代嵌套的AWK數組?

foo"blahblah#AAA17"blahblah 
foo"blahblah#BBB64"blahblah 
foo"blahblah#CCC53"blahblah 
foo"blahblah#DDD59"blahblah 
foo"blahblah#EEE22"blahblah 
foo"blahblah#FFF49"blahblah 

文件2是製表符分隔,是

AAA17 something9197 
BBB64 something333 
CCC53 something268 
DDD59 something5050 
EEE22 something4643 
FFF49 something2 

我想一些文本添加到每個file1中的線路。文本將包含來自file2的字段2,如下所示。使用gawk我可以用嵌套數組得到想要的結果:

awk -F"\t" 'FNR==NR {arr1[$1]=$2; next} {split($0,arr2,"#|\"")} {print $0": moomoo "arr1[arr2[3]]}' file2 file1 
foo"blahblah#AAA17"blahblah: moomoo something9197 
foo"blahblah#BBB64"blahblah: moomoo something333 
foo"blahblah#CCC53"blahblah: moomoo something268 
foo"blahblah#DDD59"blahblah: moomoo something5050 
foo"blahblah#EEE22"blahblah: moomoo something4643 
foo"blahblah#FFF49"blahblah: moomoo something2 

是否有一種簡單的方法可以做到不涉及嵌套數組?

請注意,這兩個文件可能有他們的行洗牌 - 不是像這裏所示的順序。

回答

1

所有你需要的是:

$ awk 'NR==FNR{arr[$1]=$2;next} {print $0 ": moomoo", arr[$3]}' file2 FS='[#"]' file1 
foo"blahblah#AAA17"blahblah: moomoo something9197 
foo"blahblah#BBB64"blahblah: moomoo something333 
foo"blahblah#CCC53"blahblah: moomoo something268 
foo"blahblah#DDD59"blahblah: moomoo something5050 
foo"blahblah#EEE22"blahblah: moomoo something4643 
foo"blahblah#FFF49"blahblah: moomoo something2 
+1

非常感謝,我不知道你可以用這種方式爲2個文件分別設置字段分隔符。 – user2138595

+0

是將變量設置爲文件之間的不同初始值是在文件列表區域設置變量的極少數正當理由之一,而不是用'-v var = value'設置它們。在GNU awk中,你可以在'BEGINFILE'部分中交替地設置它們,並且在任何awk中你總是可以做'FNR == 1 {FS ='whatever'; $ 0 = $ 0}'。 '$ 0 = $ 0'是強制awk使用新的FS值將記錄重新分割成字段。 –

0

假設文件不是太大,你的解決方案已經很好看了。 「嵌套數組」不是時間懲罰「嵌套循環」的方式。但是有一個其它方式使用內置join做到這一點,但我不知道如果我叫它做「簡單」:

cat file1|awk -F"#|\"" '{print $3,$0": moomoo"}'|sort >file3 
sort file2|join file3 -|cut -d " " -f 2- 
+1

沒用使用的貓。 – Jens