gpt4 book ai didi

linux - 比较两个或多个文件的第二列并打印所有文件的并集

转载 作者:太空宇宙 更新时间:2023-11-04 10:16:28 26 4
gpt4 key购买 nike

我有四个制表符分隔的文件 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   

但是当我将它更改为比较第二列时它不起作用

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

此外,这一次只能处理两个文件。

有没有办法通过比较 awk 中的第二列来对四个文件执行此操作?

最佳答案

使用 join已排序 输入文件上,并假设一个 shell 理解进程替换为 <(...) (我使用了您为每个输入文件提供的数据的副本,只是在顶部添加一行用于标识,这是 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) )

关于linux - 比较两个或多个文件的第二列并打印所有文件的并集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46007969/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com