2017-09-05 29 views
-2

如果兩列ID列匹配,我正在尋找替換文件中列的方法。 我有文件A.txt查找2列不同文件之間的匹配,並用awk替換第3列

c  a b ID 
0.1 0.01 5 1 
0.2 0.1 6 2 
0.3  2 3 

和文件B.txt

ID a b 
1 10 15 
2 20 16 
3 30 12 
4 40 14 

輸出即時尋找是 文件A.txt

ID a b 
1 0.01 5 
2 0.1 6 
3 30 2 

我發現有可能與以下

awk 'NR==FNR{ if(NR>1) a[$1]=$2; next } 
    FNR>1 && $1 in a && NF<3{ f=$2; $2=a[$1]; $3=f }1' B.txt A.txt | column -t 

但問題是它比較兩個文件中的$ 1。我怎麼能不是從A.txt$1B.txt

比較$4我嘗試以下

awk 'NR==FNR{ if(NR>1) a[$1]=$2; b[$1]=$1; next } 
    FNR>1 && $1~ /b[$1] in a && NF<3{ f=$2; $2=a[$1]; $3=f }1' eaf.txt final.txt | column -t 

但它沒有工作。有沒有辦法解決它?謝謝

+0

這是慣例downvoting時發表評論。 –

+0

您需要指定'FS'(例如使用tab和'FS =「\ t」'),因爲當您使用默認的'FS'時,當'NR == 4'時'A.txt'沒有$ 2。 。除此之外,這應該足夠了:'awk'NR == FNR {a [$ 1]; next} {print $ 4,$ 2,$ 3}'B A'中的$ 4。 –

+0

您需要告訴我們,「A.txt」是製表符分隔還是固定寬度的字段或別的東西,否則我們如何編寫一個工具來確定第4行的缺失值是第2行? –

回答

0

AWK解決方案:

awk 'NR==FNR{ if(NR>1) a[$1]=$2; next } 
    FNR==1{ print $NF,$2,$3; next } # output the header line rearranged 
    FNR>1 && ($NF in a){ $1=$NF; if(NF<4) { f=$2; $2=a[$1]; $3=f } else $NF="" 
    }1' B.txt A.txt | column -t 

輸出:

ID a  b 
1 0.01 5 
2 0.1 6 
3 30 2 
相關問題