【问题标题】:Bash Colum sum over a table of variable length可变长度表上的 Bash 列总和
【发布时间】:2017-10-05 14:11:28
【问题描述】:

我正在尝试获取包含数字的制表符分隔的列(第一个除外)。

要找出列数并将其存储在我使用的变量中:

cols=$(awk '{print NF}' file.txt | sort -nu | tail -n 1

接下来,我想计算该列中所有数字的总和,并在 for 循环中再次将其存储在一个变量中:

for c in 2:$col
do
  num=$(cat file.txt | awk '{sum+$2 ; print $0} END{print sum}'| tail -n 1
done

这个 num=$(cat file.txt | awk '{sum+$($c) ; print $0} END{print sum}'| tail -n 1 本身具有固定数字且没有变量输入可以找到,但我无法让它接受 for 循环变量。

感谢支持

附言如果我可以一次总结所有列(除了第一列)而没有循环问题,那也很好。

【问题讨论】:

    标签: linux bash awk sum multiple-columns


    【解决方案1】:

    假设您想要各个列的总和,

    $ cat file
    1 2 3 4
    5 6 7 8
    9 10 11 12
    
    $ awk '
        {for (i=2; i<=NF; i++) sum[i] += $i} 
        END {for (i=2; i<=NF; i++) printf "%d%s", sum[i], OFS; print ""}
    ' file
    18 21 24
    

    【讨论】:

    • 非常感谢。像魅力一样工作。
    【解决方案2】:

    如果您没有绑定到awk,有一个不错的工具,用于在名为GNU datamash 的文本文件上使用“命令行statistical operations”。

    使用datamash,对第二列求和(可能是最简单的操作)就像:

    $ datamash sum 2 < table
    9
    

    假设table 文件包含制表符分隔的数据,例如:

    $ cat table
    1   2   3   4
    2   3   4   5
    3   4   5   6
    

    要对从2n 的所有列求和,请使用column ranges(在datamash 1.2 中可用):

    $ n=4
    $ datamash sum 2-$n < table
    9   12  15
    

    要包含标题,请参阅--headers-out 选项

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-10
      • 2015-05-24
      • 2019-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-08
      相关资源
      最近更新 更多