2017-09-01 66 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)) 
相关问题