【问题标题】:How do I join multiple files by awk如何通过 awk 加入多个文件
【发布时间】:2017-04-12 06:06:39
【问题描述】:

嗯,我有几个文件,我无法使用 awk 加入它们。 以下是三个示例文件:

文件A

2   2   31771   15  5327353     4.73E-04    1   1
2   2   40642   23  27428869    -8.29E-04   1   1
2   2   21517   7   89002990    -2.41E-04   1   1
2   2   33787   16  44955568     2.86E-05   1   1

文件B

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

文件C

2   2   31771   15  5327353     4.28E-04    1   1
2   2   40642   23  27428869    -7.55E-04   1   1
2   2   21517   7   89002990    -2.01E-04   1   1
2   2   33787   16  44955568    3.09E-05    1   1

每个文件有 8 列,但我不需要第 1、2、7 和 8 列。第 3、4 和 5 列对所有文件都是通用的,这些可能是连接文件的参考列,第 6 列将是每个文件的不同信息。一般来说,我的最终文件如下所示:

最终文件

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),而不仅仅是三个。非常感谢!

【问题讨论】:

    标签: shell unix awk


    【解决方案1】:

    试试这个:

    awk '{a[$3FS$4FS$5]=a[$3FS$4FS$5]""$6FS}END{for (i in a){print i, a[i]}}' file*
    

    一个 cleaner 版本(感谢@james-brown):

    awk '{ a[$3 OFS $4 OFS $5 FS] = a[$3 OFS $4 OFS $5 FS] ( a[$3 OFS $4 OFS $5 FS] == "" ? "" : OFS) $6 }
         END{ for (i in a){print i,a[i]} }' OFS="\t"  file*
    

    输出

    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
    

    【讨论】:

    • 我比其他人更欣赏紧凑性,但我可能会{ a[$3 OFS $4 OFS $5] = a[$3 OFS $4 OFS $5] ( a[$3 OFS $4 OFS $5] == "" ? "" : OFS) $6 }。除此之外
    • 是的,更具表现力@JamesBrown +1
    • 谢谢,感谢你们的帮助。
    【解决方案2】:

    粘贴 + awk 方法(带有“漂亮”输出):

    paste fileA fileB fileC | awk '{print $3,$4,$5,$6,$14,$22}' | column -tx
    

    输出:

    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
    

    【讨论】:

      猜你喜欢
      • 2019-03-23
      • 1970-01-01
      • 2015-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多