【问题标题】:How to combine double rows keeping all unique data in column 2如何组合双行,将所有唯一数据保留在第 2 列中
【发布时间】:2019-07-12 03:42:08
【问题描述】:

我正在尝试根据第 1 列中的标识符合并相同的行。第 2 列中的信息不一定相同。如何融合双打来保留第二列的所有唯一记录?

我的数据前三行示例:

>TRINITY_DN100377_c0_g1  GO:0046556,GO:0009044,GO:0045493,
>TRINITY_DN10038_c0_g1  GO:0005783,GO:0005789,GO:0016021,GO:0004581,
>TRINITY_DN10038_c0_g1   GO:0005789,GO:0004598

我想得到:

>TRINITY_DN100377_c0_g1  GO:0046556,GO:0009044,GO:0045493,
>TRINITY_DN10038_c0_g1  GO:0005783,GO:0005789,GO:0016021,GO:0004581,GO:0004598,

所以简单地融合双精度,但保留第 2 列的所有唯一性。

我正在使用:

cat file | sort -u | awk '!seen[$1]++' > newfile

但这只会导致双打的第一行被保留,其余的被删除。

谁能帮助我,我如何保留所有唯一的 GO 术语?

【问题讨论】:

    标签: sorting unix awk


    【解决方案1】:
    $ cat tst.awk
    $1 != prev {
        printf "%s%s  ", (NR>1 ? ORS : ""), $1
        delete seen
        prev = $1
    }
    {
        n = split($2,tmp,/,/)
        for (i=1; i<=n; i++) {
            val = tmp[i]
            if ( (val != "") && !seen[val]++ ) {
               printf "%s,", val
            }
        }
    }
    END { print "" }
    $
    $ awk -f tst.awk file
    >TRINITY_DN100377_c0_g1  GO:0046556,GO:0009044,GO:0045493,
    >TRINITY_DN10038_c0_g1  GO:0005783,GO:0005789,GO:0016021,GO:0004581,GO:0004598,
    

    【讨论】:

    • 感谢 Ed,它运行良好!也让我意识到我真的需要深入研究 AWK .. :-) @Tiw,这两行代码都不起作用。如果是第二行代码,它会删除第二列的第一个“,”和最后一个“,”。
    【解决方案2】:

    如果您不介意顺序(GNU awk):

    awk -F'[, ]*' '{for (i=2;i<=NF;i++) if($i!="")a[$1][$i]}END{for(k in a){printf "%s ", k; for(j in a[k]) printf "%s,", j;print ""}} ' file
    >TRINITY_DN100377_c0_g1 GO:0046556,GO:0009044,GO:0045493,
    >TRINITY_DN10038_c0_g1 GO:0004581,GO:0005783,GO:0004598,GO:0016021,GO:0005789,
    

    如果你想删除最后一个,

    awk -F'[, ]*' '{for (i=2;i<=NF;i++) if($i!="")a[$1][$i]}END{for(k in a){e=sprintf("%s ", k); for(j in a[k]) e=e sprintf("%s,", j);sub(/.$/,"",e);print e}} ' file
    >TRINITY_DN100377_c0_g1 GO:0046556,GO:0009044,GO:0045493
    >TRINITY_DN10038_c0_g1 GO:0004581,GO:0005783,GO:0004598,GO:0016021,GO:0005789
    

    【讨论】:

      猜你喜欢
      • 2018-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-27
      • 1970-01-01
      • 2018-11-21
      • 1970-01-01
      相关资源
      最近更新 更多