我正在寻找一个命令,它将接受(作为输入)多行文本,每行包含一个整数,并输出这些整数的和。
作为一点背景知识,我有一个日志文件,其中包括计时测量。通过grepping的相关行和一点sed重新格式化,我可以列出该文件中的所有时间。我想算出总数。我可以将这个中间输出输出到任何命令,以便进行最终求和。我过去一直使用expr,但除非它在RPN模式下运行,否则我不认为它会处理这个问题(即使这样也会很棘手)。
我怎样才能得到整数的和?
我正在寻找一个命令,它将接受(作为输入)多行文本,每行包含一个整数,并输出这些整数的和。
作为一点背景知识,我有一个日志文件,其中包括计时测量。通过grepping的相关行和一点sed重新格式化,我可以列出该文件中的所有时间。我想算出总数。我可以将这个中间输出输出到任何命令,以便进行最终求和。我过去一直使用expr,但除非它在RPN模式下运行,否则我不认为它会处理这个问题(即使这样也会很棘手)。
我怎样才能得到整数的和?
当前回答
普通的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
其他回答
我的版本:
seq -5 10 | xargs printf "- - %s" | xargs | bc
提前为反勾号(“'”)的可读性道歉,但这些在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
}
bash的工作原理如下:
I=0
for N in `cat numbers.txt`
do
I=`expr $I + $N`
done
echo $I
你可以使用你喜欢的'expr'命令,你只需要先欺骗一下输入:
seq 10 | tr '[\n]' '+' | sed -e 's/+/ + /g' -e's/ + $/\n/' | xargs expr
流程如下:
"tr"将elon字符替换为+符号, Sed在“+”的两边加空格,然后从行中去掉最后的+ Xargs将管道输入插入到命令行,以便expr使用。
普通的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