【问题标题】:How to use awk to sum multiple columns (but not all) and sort by the summed values如何使用 awk 对多列(但不是全部)求和并按总和值排序
【发布时间】:2015-07-23 03:31:15
【问题描述】:

我希望我可以用 awk 和/或 sort 解决这个问题:

我有一个 19 列的制表符分隔文件,格式如下:(以“基因”开头的行是我的标题)

Gene  -100 -75 -50 -25  0 25 50 75 100  -100 -75 -50 -25  0 25 50 75 100
MLL      0   0   0   2  5  2  0  0   1     0   0   4   8  5  5  4  0   1
MLL2     0   0   0   7 10  7  0  0   1     0   0   0   7 10  7  0  0   1

我想对第 2-10 列求和,然后按此求和值对行进行排序,得到如下输出:

Gene  -100 -75 -50 -25  0 25 50 75 100  -100 -75 -50 -25  0 25 50 75 100
MLL2     0   0   0   7 10  7  0  0   1     0   0   0   7 10  7  0  0   1
MLL      0   0   0   2  5  2  0  0   1     0   0   4   8  5  5  4  0   1

我知道如果我可以用我需要的总和值制作第 20 列,那么我可以使用排序来完成这项工作:

sort -nk20 file.txt

提前致谢!

【问题讨论】:

    标签: sorting awk


    【解决方案1】:

    两步解决方案

    这对列求和并将总和打印为第 20 列:

    $ awk 'NR==1{print $0,0;next;} {s=0; for (i=2;i<=NF;i++) s+=$i; print $0,s;}' file
    Gene  -100 -75 -50 -25  0 25 50 75 100  -100 -75 -50 -25  0 25 50 75 100 0
    MLL      0   0   0   2  5  2  0  0   1     0   0   4   8  5  5  4  0   1 37
    MLL2     0   0   0   7 10  7  0  0   1     0   0   0   7 10  7  0  0   1 50
    

    现在可以按照您的建议将上述输出通过管道传输到sort -nk20

    一步解决

    如果你想在一个步骤中求和和排序并且你有 GNU awk,那么使用:

    $ awk 'BEGIN{PROCINFO["sorted_in"]="@val_num_asc"} NR==1{print;next} {s=0; for (i=2;i<=NF;i++) s+=$i; a[NR]=s; b[NR]=$0} END{for (i in a)print b[i]}' file
    

    或者,写成多行:

    awk 'BEGIN{PROCINFO["sorted_in"]="@val_num_asc"} 
        NR==1{print;next} 
        {s=0; for (i=2;i<=NF;i++) s+=$i; a[NR]=s; b[NR]=$0}
        END{for (i in a)print b[i]}' file
    

    PROCINFO 是 GNU awk 的一个特性。

    【讨论】:

    • 谢谢!这几乎正​​是我所需要的!我需要指定一定范围的列(在本例中为 2-10,我可以通过将 NF 替换为 10 来做到这一点。我最终使用了您的两步解决方案 $ awk 'NR==1{print $0,0;next ;} {s=0; for (i=2;i
    猜你喜欢
    • 2022-06-14
    • 2015-10-08
    • 2021-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-08
    • 1970-01-01
    相关资源
    最近更新 更多