我想要一个bash命令,我可以管道,将总和一列数字.我只想要一个快速的衬垫,它将做一些基本上像这样的事情:
cat FileWithColumnOfNumbers.txt | sum
Run Code Online (Sandbox Code Playgroud)
Dim*_*lov 780
paste -sd+ infile | bc
Run Code Online (Sandbox Code Playgroud)
<cmd> | paste -sd+ | bc
Run Code Online (Sandbox Code Playgroud)
编辑:使用一些粘贴实现,从stdin读取时需要更明确:
<cmd> | paste -sd+ - | bc
gho*_*g74 171
我喜欢所选择的答案.但是,它往往比awk慢,因为需要2个工具来完成这项工作.
$ wc -l file
49999998 file
$ time paste -sd+ file | bc
1448700364
real 1m36.960s
user 1m24.515s
sys 0m1.772s
$ time awk '{s+=$1}END{print s}' file
1448700364
real 0m45.476s
user 0m40.756s
sys 0m0.287s
Run Code Online (Sandbox Code Playgroud)
Jon*_*ler 49
两行是否算在内?
awk '{ sum += $1; }
END { print sum; }' "$@"
Run Code Online (Sandbox Code Playgroud)
然后你就可以在没有多余的'猫'的情况下使用它:
sum < FileWithColumnOfNumbers.txt
sum FileWithColumnOfNumbers.txt
Run Code Online (Sandbox Code Playgroud)
FWIW:在MacOS X上,您可以使用单行:
awk '{ sum += $1; } END { print sum; }' "$@"
Run Code Online (Sandbox Code Playgroud)
min*_*s23 44
以下命令将添加所有行(awk输出的第一个字段)
awk '{s+=$1} END {print s}' filename
Run Code Online (Sandbox Code Playgroud)
Dim*_*lov 17
[对ghostdog74s评论的跟进]
bash-2.03$ uname -sr
SunOS 5.8
bash-2.03$ perl -le 'print for 1..49999998' > infile
bash-2.03$ wc -l infile
49999998 infile
bash-2.03$ time paste -sd+ infile | bc
bundling space exceeded on line 1, teletype
Broken Pipe
real 0m0.062s
user 0m0.010s
sys 0m0.010s
bash-2.03$ time nawk '{s+=$1}END{print s}' infile
1249999925000001
real 2m0.042s
user 1m59.220s
sys 0m0.590s
bash-2.03$ time /usr/xpg4/bin/awk '{s+=$1}END{print s}' infile
1249999925000001
real 2m27.260s
user 2m26.230s
sys 0m0.660s
bash-2.03$ time perl -nle'
$s += $_; END { print $s }
' infile
1.249999925e+15
real 1m34.663s
user 1m33.710s
sys 0m0.650s
Run Code Online (Sandbox Code Playgroud)
DVK*_*DVK 11
你可以使用bc(计算器).假设您的#s文件名为"n":
$ cat n
1
2
3
$ (cat n | tr "\012" "+" ; echo "0") | bc
6
Run Code Online (Sandbox Code Playgroud)
将tr所有换行符更改为"+"; 然后我们在最后一个加号后追加0,然后我们将表达式(1+2+3+0)传递给计算器
或者,如果您使用awk或perl,那么这是一个Perl单行程序:
$perl -nle '$sum += $_ } END { print $sum' n
6
Run Code Online (Sandbox Code Playgroud)
while read -r num; do ((sum += num)); done < inputfile; echo $sum
Run Code Online (Sandbox Code Playgroud)
使用for循环遍历您的文件…
sum=0; for x in `cat <your-file>`; do let sum+=x; done; echo $sum
Run Code Online (Sandbox Code Playgroud)
如果你安装了 ruby
cat FileWithColumnOfNumbers.txt | xargs ruby -e "puts ARGV.map(&:to_i).inject(&:+)"
Run Code Online (Sandbox Code Playgroud)