【问题标题】:summing the values of a column row wise逐行求和列的值
【发布时间】:2021-07-24 05:57:59
【问题描述】:

专家我有一个输入文件

>   >   >
0.000   5.064   1.0
0.100   9.064   5.0
0.200   5.064   6.3
0.300   9.064   4.2
0.400   5.064   2.3
>   >   >
0.000   4.977   1.2 
0.100   6.977   1.8
0.200   4.977   1.2
0.300   6.977   1.8
0.400   4.977   9.6

我想逐行求和第三列的值,输出应该是

0.000   2.2
0.100   6.8
0.200   7.5
0.300   6.0
0.400   11.9

我试过了

awk '{sum=0; for(i=1; i<=NF; i++) sum += $i; print sum}'  input_file > out_file

但问题是我无法按预期安排文件。我需要一些解决方案。提前致谢。

【问题讨论】:

    标签: for-loop awk


    【解决方案1】:

    使用显示的示例和使用sort + awk 解决方案的任何awk,请尝试以下操作。由于这是首先对 Input_file 进行排序并运行 awk 程序,因此它将尽快退出文件中第一次出现的 &gt;,如果 Input_file 很大,这可以节省一些时间。

    LC_ALL='C' sort -k1 Input_file | 
    awk '
    /^>/{ exit }
    prev!=$1{
      printf("%s %.01f\n",prev,sum)
      sum=0
    }
    {
      sum+=$3
      prev=$1
    }
    END{
      printf("%s %.01f\n",prev,sum)
    }
    '
    

    输出如下:

    0.000 2.2
    0.100 6.8
    0.200 7.5
    0.300 6.0
    0.400 11.9
    

    解释: 简单的解释是:首先使用第一个字段对 Input_file 进行排序(其中以 &gt; 开头的行将最后显示示例)。然后将其标准输出作为标准输入传递给awk 程序。在awk 程序中,如果当前行的第一个字段与其先前的值不同,则检查每一行,然后打印总和和先前的字段值。在每一行中,继续将第三个字段值添加到总和,并将当前的第一个字段值保留到 prev 变量。



    编辑:如果您的 Input_file 是制表符分隔的,请尝试以下代码。

    LC_ALL='C' sort -t'\t' -k1 file2 | 
    awk '
    BEGIN{ FS=OFS="\t" }
    /^>/ { exit        }
    prev!=$1{
      print prev,sum
      sum=0
    }
    {
      sum+=$3
      prev=$1
    }
    END{
      print prev,sum
    }'
    

    【讨论】:

      【解决方案2】:

      使用GNU awk 和PROCINFO["sorted_in"] 对数组n 进行排序:

      awk '$1!=">"{n[$1]=n[$1]+$3}
           END{
             PROCINFO["sorted_in"] = "@ind_num_asc";
             for (i in n){
               printf("%s %.1f\n", i, n[i])
             }
           }' file
      

      输出:

      0.000 2.2 0.100 6.8 0.200 7.5 0.300 6.0 0.400 11.9

      【讨论】:

        猜你喜欢
        • 2014-12-05
        • 1970-01-01
        • 2018-05-15
        • 1970-01-01
        • 1970-01-01
        • 2016-12-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多