我有一个如下所示的文件:
1
3
4
1
4
3
1
2
我怎样才能找到这个总数(即 1+3+4+1+4+3+1+2 = 19)?
答案1
bc
借助一些帮助,paste
将各行合并为一行,并以+
作为分隔符:
paste -sd+ file.txt | bc
要使用 (或任何其他命令)的输出grep
而不是静态文件,请将grep
的 STDOUT 传递给 的 STDIN paste
:
grep .... | paste -sd+ | bc
例子:
% cat file.txt
1
3
4
1
4
3
1
2
% paste -sd+ file.txt | bc
19
% grep . file.txt | paste -sd+ | bc
19
如果必须使用bash
,那么您可以使用数组来保存文件内容,然后迭代元素,或者您可以逐行读取文件并对每行求和,第二种方法会更有效:
$ time { nums=$(<file.txt); for i in ${nums[@]}; do (( sum+=i )); done; echo $sum ;}
19
real 0m0.002s
user 0m0.000s
sys 0m0.000s
$ time { while read i; do (( sum+=i )); done <file.txt; echo $sum ;}
19
real 0m0.000s
user 0m0.000s
sys 0m0.000s
答案2
你也可以使用 awk。要计算*。TXT包含单词“hello”的文件:
grep -ch 'hello' *.txt | awk '{n += $1}; END{print n}'
简单地对文件中的数字求和:
awk '{n += $1}; END{print n}' file.txt
答案3
numsum
从包装中取出使用num-utils
!
(您可能需要sudo apt-get install num-utils
)
该命令numsum
默认只执行您需要的操作;
$ numsum file.txt
19
逐行读取测试数字stdin
:
$ printf '
1
3
4
1
4
3
1
2' | numsum
19
或者从一行读起:
$ printf '1 3 4 1 4 3 1 2' | numsum -r
19
更多实用工具
该软件包还包含一些其他值得更多人了解的数字处理实用程序:
numaverage - find the average of the numbers, or the mode or median
numbound - find minimum of maximum of all lines
numgrep - to find numbers matching ranges or sets
numinterval - roughly like the first derivative
numnormalize - normalize numbers to an interval, like 0-1
numrandom - random numbers from ranges or sets, eg odd.
numrange - similar to seq
numround - round numbers up, down or to nearest
以及更通用的计算器命令numprocess
,
它将命令行中的表达式应用于输入行中的数字。
答案4
一个简单的方法是使用 shell 的内置功能:
SUM=0; while read N; do SUM=$((SUM+N)); done </path/to/file
echo $SUM
这将逐行读取您的文件,汇总并打印结果。
如果您想使用管道并且只使用第一行,它的工作方式如下:
SUM=0
your_command | while read -r LINE; do for N in $LINE; do break; done; SUM=$((SUM+N)); done
echo $SUM
获取第一个元素的方法如下:
LIST="foo bar baz"
for OBJ in $LIST; do break; done
echo $OBJ
foo