最短的命令来计算在Unix上的一列输出的总和?

我确信有一种快速简便的方法可以计算出Unix系统上一列值的总和(使用awkxargs ),但编写一个shell脚本来逐行解析行是唯一的现在想起来。

例如,修改以下命令以计算并显示SEGSZ列(70300)的总数的最简单方法是什么?

ipcs -mb | head -6
IPC status from /dev/kmem as of Mon Nov 17 08:58:17 2008
T         ID     KEY        MODE        OWNER     GROUP      SEGSZ
Shared Memory:
m          0 0x411c322e --rw-rw-rw-      root      root        348
m          1 0x4e0c0002 --rw-rw-rw-      root      root      61760
m          2 0x412013f5 --rw-rw-rw-      root      root       8192

ipcs -mb | tail +4 | awk '{ sum += $7 } END { print sum }'

或者没有尾巴:

ipcs -mb | awk 'NR > 3 { sum += $7 } END { print sum }'

使用aw和bc来获得任意长的结果(得分给Jouni K. ):

ipcs -mb | awk 'NR > 3 { print $7 }' | paste -sd+ | bc

我会尝试构造一个计算字符串并将其按如下所示提供给bc:

  • grep包含数字的行
  • 在每行的数字之前(和之后)将所有字符分开
  • xargs结果(获得由空格分隔的一串数字)
  • 将空格转换为'+'字符
  • 好胃口BC!
  • ipcs -mb | grep -w '^m ' | sed 's/^.*s//' | xargs | tr ' ' + | bc

    看起来这比awk解决方案稍微长一些,但对于无法阅读(并理解)奇怪awk代码的人来说,这可能更容易理解...... :-)

    如果未安装bc,则可以在上面的步骤5中使用双括号来计算结果:

  • echo $(( $(ipcs -mb | grep -w '^m ' | sed 's/^.*s//' | xargs | tr ' ' +) ))或者
  • SUM=$(( $(ipcs -mb | grep -w '^m ' | sed 's/^.*s//' | xargs | tr ' ' +) ))或者
  • (( SUM=$(ipcs -mb | grep -w '^m ' | sed 's/^.*s//' | xargs | tr ' ' +) ))
  • 双括号之前和之后的间距是可选的。


    我有一个实用程序脚本,它将所有列简单地相加。 通常很容易从单行输出中获取所需的一个。 作为奖励,一些SI后缀被识别。

    #!/usr/bin/awk -f
    # Sum up numerical values by column (white-space separated)
    #
    # Usage:  $0 [file ...]
    #
    # stern, 1999-2005
    
    {
        for(i = 1; i <= NF; ++i) {
            scale = 1
            if ($i ~ /[kK]$/) { scale = 1000 }
            if ($i ~ /[mM]$/) { scale = 1000*1000 }
            if ($i ~ /[gG]$/) { scale = 1000*1000*1000 }
            col[i] += scale * $i;
        }
        if (NF > maxnf) maxnf = NF;
    }
    
    END {
        for(i = 1; i <= maxnf; ++i) { printf " %.10g", col[i] }
        print "";
    }
    

    自定义字段分隔符的示例:

    $ head /etc/passwd | addcol -F:
    0 0 45 39 0 0 0
    
    链接地址: http://www.djcxy.com/p/38149.html

    上一篇: Shortest command to calculate the sum of a column of output on Unix?

    下一篇: Why Doesn't C# Allow Static Methods to Implement an Interface?