【问题标题】:Merge rows by duplicate columns in awk/unix commands通过 awk/unix 命令中的重复列合并行
【发布时间】:2018-01-26 17:17:06
【问题描述】:

我有一个包含 tab-delim 列的文件,如下所示:

islet   Can c37 P39036.1
islet   Hum c37 P240652.3
islet   Hum c37 P437357.1
islet   Mou c37 P43956.2
prot    Can c46 P14676.3

对于 $3 中的每个唯一字符串,我需要合并 $1、$2 和 $4,以便输出如下所示:

islet   Can,Hum,Mou    c37    P39036.1,P240652.3,P437357.1,P43956.2
prot    Can    c46    P14676.3

我认为这是一项可能有现有解决方案的常见任务。有人可以在 awk/unix 命令中为此提供解决方案吗?

【问题讨论】:

  • 文件已经排序了吗?
  • 是,按$3排序
  • COuld someone offer a solution for this in awk/unix command no.. 但如果您将自己的努力添加到问题中,您将获得帮助 :) 我认为某处有重复.. 另外,我认为 datamash 命令可能在这里帮助
  • @Sundeep 我同意,但我坚信可能存在我找不到的副本,因此我期待某种形式的帮助!!!
  • @Sundeep,是的,datamash 在这种情况下感觉很好)

标签: awk merge


【解决方案1】:

Awk解决方案:

(文件已按第三个字段排序)

awk 'k && $3 != k{ print f1, f2[k], k, f4[k]; delete f2; delete f4 }
     { f1=$1; k=$3; f2[k]=(f2[k]? f2[k]"," : "")$2; f4[k]=(f4[k]? f4[k]"," : "")$4 }
     END{ print f1, f2[k], k, f4[k] }' file

输出:

islet Can,Hum,Hum,Mou c37 P39036.1,P240652.3,P437357.1,P43956.2
prot Can c46 P14676.3

【讨论】:

    猜你喜欢
    • 2020-06-23
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    • 2010-10-17
    • 2017-03-02
    • 1970-01-01
    • 1970-01-01
    • 2017-12-06
    相关资源
    最近更新 更多