当前位置:  开发笔记 > 编程语言 > 正文

用于计算Unix上输出列总和的最短命令?

如何解决《用于计算Unix上输出列总和的最短命令?》经验,为你挑选了2个好方法。

我确信有一种快速简便的方法来计算Unix系统上的一列值的总和(使用awk或类似的东西xargs),但是编写一个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

Johannes Sch.. 83

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

或没有尾巴:

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

使用awk和bc来获得任意长的结果(信用Jouni K.):

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

printf"%d \n",总和应该这样做.(不是%fi猜测.不知道为什么我认为这是一个浮点:p) (2认同)


Peterino.. 13

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

    grep包含数字的行

    在每行之前(和之后)删除所有字符

    xargs结果(获取由空格分隔的数字串)

    TR anslate坯料为"+"字符

    胃口好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 ' ' +) ))

双括号之前和之后的间距是可选的.



1> Johannes Sch..:
ipcs -mb | tail +4 | awk '{ sum += $7 } END { print sum }'

或没有尾巴:

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

使用awk和bc来获得任意长的结果(信用Jouni K.):

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


printf"%d \n",总和应该这样做.(不是%fi猜测.不知道为什么我认为这是一个浮点:p)

2> Peterino..:

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

    grep包含数字的行

    在每行之前(和之后)删除所有字符

    xargs结果(获取由空格分隔的数字串)

    TR anslate坯料为"+"字符

    胃口好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 ' ' +) ))

双括号之前和之后的间距是可选的.

推荐阅读
手机用户2502852037
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有