【问题标题】:add columns in awk from two files从两个文件在 awk 中添加列
【发布时间】:2013-10-15 02:41:51
【问题描述】:

我有两个如下所示的以​​制表符分隔的文件:

文件 A

chr1   123 aa b c d
chr1   234 a  b c d
chr1   345 aa b c d
chr1   456 a  b c d
....

文件B

chr1   123    aa    c    d    e   ff
chr1   345    aa    e    f    g   gg
chr1   123    aa    c    d    e   hh
chr1   567    aa    z    c    a   ii
chr1   345    bb    x    q    r   kk
chr1   789    df    f    g    s   ff
chr1   345    sh    d    t    g   ll

...

我想根据 2 个关键列“chr1”、“123”,即(前两列是关键列),从文件 B 向文件 A 添加一个新列。如果两个文件中的键列都匹配,则应将文件 B 中第 7 列的数据添加到文件 A 中的第 3 列。

例如 (chr1 123) 键在文件 B 中出现两次,因此文件 A 中的第 3 列的 ff 和 hh 用逗号分隔。如果未找到密钥,则应输入 NA 并且输出应如下所示: 输出:

chr1   123  ff,hh       aa    b    c    d   
chr1   234    NA        a     b    c    d
chr1   345  gg,kk,ll    aa   b    c    d
chr1   456    NA        a    b    c     d

我通常在 R 中执行此操作,但对于大型数据集需要大量时间。有人可以提供一个 awk 解决方案来加快任务吗?

【问题讨论】:

  • 是的,我们可以,但请先展示您的尝试
  • 好吧,我是 awk 的新手,我可以做一些文件处理之类的事情,但不能做任何真正的代码。我在 R 中使用折叠函数执行此操作,但在 awk 中不知道。

标签: join awk


【解决方案1】:

试试这条 awk 行:

awk -F'\t' -v OFS='\t' 'NR==FNR{a[$1FS$2]=a[$1FS$2]?a[$1FS$2]","$7:$7;next}
{$3=(($1FS$2 in a)?a[$1FS$2]:"NA")FS $3}7' fileB fileA

【讨论】:

  • 您好,是否可以使用上述代码再添加一列。我们只添加了第 7 列,同样我们是否可以在第 7 列中再添加一列,例如第 5 列?我玩弄了代码,但无法做到这一点。提前致谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 2017-07-20
  • 2017-07-09
  • 1970-01-01
  • 2013-02-09
  • 2013-06-24
相关资源
最近更新 更多