如何计算文件中各行数字之和

如何计算文件中各行数字之和

我有一个如下所示的文件:

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

相关内容