2017-09-01 23 views
0

我有四個選項卡分隔文件1.txt,2.txt,3.txt,4.txt。每個都具有以下格式比較兩個或更多文件的第二列並打印所有文件的聯合

89 ABI1 0.19 
93 ABL1 0.15 
94 ABL2 0.07 
170 ACSL3 0.21  

我想所有的文件和打印聯盟(基於第2列)的第2列比較到新的文件,像下面:

 1.txt 2.txt 3.txt 4.txt 
ABL2 0.07 0.01 0.11 0.009 
AKT1 0.31 0.05 0.05 0.017 
AKT2 0.33 0.05 0.01 0.004 

怎麼可能在AWK? 我試着以下,但這只是比較第一列,

awk 'NR==FNR {h[$1] = $0; next} {print $1,h[$1]}' OFS="\t" 2.txt 1.txt 

但是當我將其更改爲比較第2列不會在時間上的兩個文件的工作

awk 'NR==FNR {h[$2] = $0; next} {print $1,h[$2]}' OFS="\t" 2.txt 1.txt  

而且這僅適用。

有沒有辦法通過比較awk中的第二列來對四個文件做這件事?

+0

你可以張貼'2.txt'和'3.txt'的內容? – RomanPerekhrest

回答

1

使用join排序輸入文件,並假設與<(...)理解過程換人殼(我用的是你對每個輸入文件中提供的數據的副本,只是在頂部標識添加一行,這是AAA行):

$ join <(join -1 2 -2 2 -o 0,1.3,2.3 1.txt 2.txt) \ 
     <(join -1 2 -2 2 -o 0,1.3,2.3 3.txt 4.txt) 
AAA 1 2 3 4 
ABI1 0.19 0.19 0.19 0.19 
ABL1 0.15 0.15 0.15 0.15 
ABL2 0.07 0.07 0.07 0.07 
ACSL3 0.21 0.21 0.21 0.21 

這裏有三個連接。前兩項是<(...)。其中第一個加入前兩個文件,第二個加入最後兩個文件。其中的一個結果加入模樣

AAA 1 2 
ABI1 0.19 0.19 
ABL1 0.15 0.15 
ABL2 0.07 0.07 
ACSL3 0.21 0.21 

選項-o 0,1.3,2.3指「輸出與兩個文件場3沿着連接字段」。 -1 2 -2 2的意思是「使用每個文件的字段2作爲連接字段(而不是字段1)」。

最外面的join取得這兩個結果並執行產生輸出的最終連接。

如果輸入的文件不排序的連接字段:

$ join <(join -1 2 -2 2 -o 0,1.3,2.3 <(sort -k2,2 1.txt) <(sort -k2,2 2.txt)) \ 
     <(join -1 2 -2 2 -o 0,1.3,2.3 <(sort -k2,2 3.txt) <(sort -k2,2 4.txt)) 
相關問題