我有一个看起来像这样的文件:
1
3
4
1
4
3
1
2
Run Code Online (Sandbox Code Playgroud)
我怎样才能找到这个的总数(即 1+3+4+1+4+3+1+2 = 19)?
hee*_*ayl 66
bc
在一点帮助下paste
将行合并+
为一个分隔符:
paste -sd+ file.txt | bc
Run Code Online (Sandbox Code Playgroud)
要使用grep
(或任何其他命令)的输出而不是静态文件,请将grep
的 STDOUT传递给 的 STDIN paste
:
grep .... | paste -sd+ | bc
Run Code Online (Sandbox Code Playgroud)
例子:
% cat file.txt
1
3
4
1
4
3
1
2
% paste -sd+ file.txt | bc
19
% grep . file.txt | paste -sd+ | bc
19
Run Code Online (Sandbox Code Playgroud)
如果必须使用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
Run Code Online (Sandbox Code Playgroud)
Cra*_*e84 22
你也可以使用 awk。要计算*.txt文件中包含单词“hello”的总行数:
grep -ch 'hello' *.txt | awk '{n += $1}; END{print n}'
Run Code Online (Sandbox Code Playgroud)
简单地将文件中的数字相加:
awk '{n += $1}; END{print n}' file.txt
Run Code Online (Sandbox Code Playgroud)
Vol*_*gel 13
numsum
从包装中使用num-utils
!(你可能需要sudo apt-get install num-utils
)
numsum
默认情况下,该命令仅执行您需要的操作;
$ numsum file.txt
19
Run Code Online (Sandbox Code Playgroud)
逐行读取测试编号stdin
:
$ printf '
1
3
4
1
4
3
1
2' | numsum
19
Run Code Online (Sandbox Code Playgroud)
或者从一行阅读:
$ printf '1 3 4 1 4 3 1 2' | numsum -r
19
Run Code Online (Sandbox Code Playgroud)
该软件包包含一些其他值得广为人知的数字处理实用程序:
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
Run Code Online (Sandbox Code Playgroud)
以及更通用的计算器命令numprocess
,
它将命令行中的表达式应用于输入行上的数字。