2016-04-23 80 views
0

我有兩個文件。如何使用awk比較和替換字段

12345||||||1000||756432|||| 
aaaaa||||||986754812345||986754|||| 
ccccc||||||134567222222||134567|||| 

file2的:如果現場9文件-1和場1文件-2是相同的,然後用場2的文件-1

file1的替換現場1文件-1:

756432|AAAAAAAAAAA 
986754|20030040000 

預期輸出是:

12345||||||AAAAAAAAAAA||756432|||| 
aaaaa||||||20030040000||986754|||| 
ccccc||||||134567222222||134567||| 

我想這個代碼

awk -F"|" 'NR==FNR{a[$1]=$2} NR>FNR{$7=a[$2];print}' OFS='|' file2 file1 

但不是替換該字段,而是將其刪除。

回答

2

您正在使用錯誤的列作爲第二個塊中數組的索引,並且您沒有檢查丟失的鍵。這將產生您發佈的輸出:

awk -F '|' -v OFS='|' 'NR==FNR{a[$1]=$2;next}$9 in a{$7=a[$9]}1' file2 file1 
+0

謝謝你的建議,能否請你解釋[$ 9] = 「!」 – SGS

+0

@SGS:當然,用'一[$ 9] =! 「」'我們測試是否數組'a'包含字段'$ 9'中表示的字符串的值,所以當在file2中找到相應的值時,我們只更改'$ 7'的值。 – user000001

+0

而不是'a [$ 9]!=「」'你可能會考慮'a'中的$ 9。對於前者,awk實際上會添加一個$ 9作爲索引和一個空值的數組元素。後者只是檢查它是否存在,而不使用任何額外的內存。通常情況下,無論哪種方式都很好,但在涉及大量文件時要記住差異。 – jas