我正在寻找一个命令,它将接受(作为输入)多行文本,每行包含一个整数,并输出这些整数的和。

作为一点背景知识,我有一个日志文件,其中包括计时测量。通过grepping的相关行和一点sed重新格式化,我可以列出该文件中的所有时间。我想算出总数。我可以将这个中间输出输出到任何命令,以便进行最终求和。我过去一直使用expr,但除非它在RPN模式下运行,否则我不认为它会处理这个问题(即使这样也会很棘手)。

我怎样才能得到整数的和?


当前回答

简单的bash一行

$ cat > /tmp/test
1 
2 
3 
4 
5
^D

$ echo $(( $(cat /tmp/test | tr "\n" "+" ) 0 ))

其他回答

普通的bash:

$ cat numbers.txt 
1
2
3
4
5
6
7
8
9
10
$ sum=0; while read num; do ((sum += num)); done < numbers.txt; echo $sum
55

C(未简化)

seq 1 10 | tcc -run <(cat << EOF
#include <stdio.h>
int main(int argc, char** argv) {
    int sum = 0;
    int i = 0;
    while(scanf("%d", &i) == 1) {
        sum = sum + i;
    }
    printf("%d\n", sum);
    return 0;
}
EOF)

Rebol中的一句话:

rebol -q --do 's: 0 while [d: input] [s: s + to-integer d] print s' < infile.txt

不幸的是,上述在Rebol 3中还不能工作(INPUT不能流化STDIN)。

下面是一个在Rebol 3中也适用的临时解决方案:

rebol -q --do 's: 0 foreach n to-block read %infile.txt [s: s + n] print s'

给红宝石爱好者

ruby -e "puts ARGF.map(&:to_i).inject(&:+)" numbers.txt

提前为反勾号(“'”)的可读性道歉,但这些在shell中工作,而不是bash,因此更易于粘贴。如果你使用一个接受它的shell, $(command…)格式比' command…所以为了你的理智,请随意修改。

我在bashrc中有一个简单的函数,它将使用awk来计算一些简单的数学项

calc(){
  awk 'BEGIN{print '"$@"' }'
}

这将做 +,-,*,/,^,%, √6,罪恶,因为,括号……(取决于你的awk版本)…你甚至可以用printf和格式化浮点输出,但这是我通常需要的

对于这个特定的问题,我将对每一行简单地这样做:

calc `echo "$@"|tr " " "+"`

所以对每一行求和的代码块看起来像这样:

while read LINE || [ "$LINE" ]; do
  calc `echo "$LINE"|tr " " "+"` #you may want to filter out some lines with a case statement here
done

如果你想逐行求和的话。但是,对于数据文件中的每个数字的总数

VARS=`<datafile`
calc `echo ${VARS// /+}`

顺便说一句,如果我需要在桌面上快速做一些事情,我使用这个:

xcalc() { 
  A=`calc "$@"`
  A=`Xdialog --stdout --inputbox "Simple calculator" 0 0 $A`
  [ $A ] && xcalc $A
}