如何对文件中的行数求和

Tim*_*Tim 47 bash files

我有一个看起来像这样的文件:

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)

  • 标准输入方式对我不起作用,直到我在另一个答案中发现我必须使用`paste -sd+ -`。请修改那个。 (2认同)

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)

  • 是的。这确实与 heemayl 的答案相同,但它使用 awk 而不是 paste 和 bc,这最终提供了更大的灵活性。不过,他的回答很好,他是第一个,所以他值得你投票! (2认同)

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
它将命令行中的表达式应用于输入行上的数字。