Shell 如何通过awk连接多个文件

Shell 如何通过awk连接多个文件,shell,unix,awk,Shell,Unix,Awk,嗯,我有几个文件,我很难将它们与awk连接起来。 以下是三个示例文件: 菲拉 文件 2 2 31771 15 5327353 5.07E-04 1 1 2 2 40642 23 27428869 5.45E-04 1 1 2 2 21517 7 89002990 1.85E-04 1 1 2 2 33787 16 44955568 3.73E-04 1 1 文件 每个文件

嗯,我有几个文件,我很难将它们与awk连接起来。 以下是三个示例文件:

菲拉

文件

2   2   31771   15  5327353     5.07E-04    1   1
2   2   40642   23  27428869    5.45E-04    1   1
2   2   21517   7   89002990    1.85E-04    1   1
2   2   33787   16  44955568    3.73E-04    1   1
文件

每个文件有8列,但我不需要第1、2、7和8列。第3列、第4列和第5列是所有文件的公用列,它们可能是连接文件的参考列,第6列是每个文件的不同信息。通常,我的最终文件如下所示:

2   2   31771   15  5327353     4.73E-04    5.07E-04
2   2   40642   23  27428869    -8.29E-04   5.45E-04
2   2   21517   7   89002990    -2.41E-04   1.85E-04
2   2   33787   16  44955568    2.86E-05    3.73E-04
最终文件

31771   15  5327353     4.73E-04    5.07E-04    4.28E-04
40642   23  27428869    -8.29E-04   5.45E-04    -7.55E-04
21517   7   89002990    -2.41E-04   1.85E-04    -2.01E-04
33787   16  44955568    2.86E-05    3.73E-04    3.09E-05
我尝试了以下命令:

awk 'NR==FNR{a[$3]=$6;next}{print $3"\t"$4"\t"$5"\t"$6"\t"a[$3]}' FileA FileB FileC > Finalfile
但不幸的是,它只适用于两个文件,我得到如下结果:

2   2   31771   15  5327353     4.73E-04    5.07E-04
2   2   40642   23  27428869    -8.29E-04   5.45E-04
2   2   21517   7   89002990    -2.41E-04   1.85E-04
2   2   33787   16  44955568    2.86E-05    3.73E-04
有人能帮忙吗?请记住,有多个文件(10个),而不仅仅是三个。多谢各位

试试看:

awk '{a[$3FS$4FS$5]=a[$3FS$4FS$5]""$6FS}END{for (i in a){print i, a[i]}}' file*
更干净的版本(谢谢@james brown):

输出

33787   16  44955568    2.86E-05    3.73E-04    3.09E-05
21517   7   89002990    -2.41E-04   1.85E-04    -2.01E-04
40642   23  27428869    -8.29E-04   5.45E-04    -7.55E-04
31771   15  5327353     4.73E-04    5.07E-04    4.28E-04
尝试一下:

awk '{a[$3FS$4FS$5]=a[$3FS$4FS$5]""$6FS}END{for (i in a){print i, a[i]}}' file*
更干净的版本(谢谢@james brown):

输出

33787   16  44955568    2.86E-05    3.73E-04    3.09E-05
21517   7   89002990    -2.41E-04   1.85E-04    -2.01E-04
40642   23  27428869    -8.29E-04   5.45E-04    -7.55E-04
31771   15  5327353     4.73E-04    5.07E-04    4.28E-04
粘贴+awk方法(具有“漂亮”输出):

输出:

31771  15  5327353   4.73E-04   5.07E-04  4.28E-04
40642  23  27428869  -8.29E-04  5.45E-04  -7.55E-04
21517  7   89002990  -2.41E-04  1.85E-04  -2.01E-04
33787  16  44955568  2.86E-05   3.73E-04  3.09E-05
粘贴+awk方法(具有“漂亮”输出):

输出:

31771  15  5327353   4.73E-04   5.07E-04  4.28E-04
40642  23  27428869  -8.29E-04  5.45E-04  -7.55E-04
21517  7   89002990  -2.41E-04  1.85E-04  -2.01E-04
33787  16  44955568  2.86E-05   3.73E-04  3.09E-05

我比下一个家伙更欣赏紧凑,但我可能会
{a[$3 OFS$4 OFS$5]=a[$3 OFS$4 OFS$5](a[$3 OFS$4 OFS$5]==“”?“”:OFS)$6}
。除此之外,是的,非常有表现力@JamesBrown+1谢谢,我感谢你们的帮助。我比下一个家伙更欣赏紧凑性,但我可能会
{a[$3 OFS$4 OFS$5]=a[$3 OFS$4 OFS$5](a[$3 OFS$4 OFS$5]==“”?“”:OFS)$6}
。除此之外,是的,非常有表现力@JamesBrown+1谢谢,我非常感谢你们的帮助。