2017-09-01 104 views
2

我有兩個文件 - FileA和FileB。 FileA將被改變。 FileB包含新的值。 FileB有3個字段。前兩個字段將與FileA的前兩個字段進行比較。如果這些字段匹配,則應更改Field3。下面的代碼以這種方式工作:「如果兩個值匹配,則更改field3並打印該行,如果沒有匹配,則接下來。」我想要的行爲是,「如果沒有匹配,則不改變地打印該行。」代碼的「其他」部分不起作用,我嘗試了很多變體。AWK如果匹配,打印帶有新值的字段,否則打印行

awk -F'\t' -v OFS='\t' ' 
# first, read in data from file B 
NR == FNR { values[$1 FS $2] = $3; next } 

# then, output modified lines from matching lines in file A 
($1 FS $2) in values { $3 = values[$1 FS $2]; print } else { print $0 } 
' fileB fileA 

FILEA

PROVDSRJ02.RD.RI ae0.0 16  
PROVDSRJ02.RD.RI ae1.1 1000  
PROVDSRJ02.RD.RI ae2.0 5000  
PROVDSRJ02.RD.RI ae3.0 5000  
ASHBBBRJ01.RD.AS ae39.0 16  
ASHBBPRJ01.RD.AS ae2.0 16  
ASHBBPRJ02.RD.AS ae1.0 16  
ASHBBPRJ02.RD.AS ae2.0 16  
ASHBBBRJ01.RD.AS ae0.0 16  
ASHBBBRJ01.RD.AS ae11.0 16 

FILEB

ASHBBBRJ01.RD.AS ae10.0 524 
ASHBBBRJ01.RD.AS ae11.0 235 
ASHBBBRJ01.RD.AS ae39.0 2096 
ASHBBBRJ01.RD.AS ae6.0 183 
ASHBBBRJ01.RD.AS ae7.0 1141 
ASHBBBRJ02.RD.AS ae11.0 88 
ASHBBBRJ02.RD.AS ae13.0 333 
ASHBBBRJ02.RD.AS ae20.0 374 
ASHBBBRJ02.RD.AS ae9.0 1885 

所需的輸出(**表示改變的行,並且不應該被包括在代碼)

PROVDSRJ02.RD.RI ae0.0 16  
PROVDSRJ02.RD.RI ae1.1 1000  
PROVDSRJ02.RD.RI ae2.0 5000  
PROVDSRJ02.RD.RI ae3.0 5000  
**ASHBBBRJ01.RD.AS ae39.0 2096**  
ASHBBPRJ01.RD.AS ae2.0 16  
ASHBBPRJ02.RD.AS ae1.0 16  
ASHBBPRJ02.RD.AS ae2.0 16  
ASHBBBRJ01.RD.AS ae0.0 16  
**ASHBBBRJ01.RD.AS ae11.0 235** 
+0

請將'FileA'和'FileB'的樣本與期望的輸出一起發佈。謝謝。 –

+1

請仔細閱讀[MCVE](https://stackoverflow.com/help/mcve)並遵守它或有被忽略的風險 – Thor

+0

它不是重複的。有人評論了最後一篇文章,並說要創建一個新帖子...我只是按照我所告訴的... – user3746195

回答

2

你的語法是關閉。檢查tag info獲取一些學習資源。

在任何情況下,您都不需要這樣的else。您可以有條件地將$3設置爲新值(如您已經在做),然後始終打印該行(可能已被修改或未被修改)。

這裏我們使用快捷鍵1來始終打印該行。 1是一個始終爲真的模式,它調用默認操作,即打印當前行。如果現在沒有意義,它很快就會出現。

$ awk 'BEGIN {FS=OFS="\t"} 
     NR == FNR {values[$1 FS $2] = $3; next} 
     ($1 FS $2) in values {$3 = values[$1 FS $2]}1' fileB fileA 
PROVDSRJ02.RD.RI ae0.0 16 
PROVDSRJ02.RD.RI ae1.1 1000 
PROVDSRJ02.RD.RI ae2.0 5000 
PROVDSRJ02.RD.RI ae3.0 5000 
ASHBBBRJ01.RD.AS ae39.0 2096 
ASHBBPRJ01.RD.AS ae2.0 16 
ASHBBPRJ02.RD.AS ae1.0 16 
ASHBBPRJ02.RD.AS ae2.0 16 
ASHBBBRJ01.RD.AS ae0.0 16 
ASHBBBRJ01.RD.AS ae11.0 235 
+0

考慮設置「{idx = $ 1 FS $ 2}」,那麼在所有地方都使用'idx',而不是在3個地方硬編碼$ 1 FS $ 2'。 –