AWK如何计算总和

AWK如何计算总和

输入文件(FileInput.txt):

10 20 3 100 5 3 27

这是我的 awk 脚本:

BEGIN{ while((getline line < "FileInput.txt") > 0) { }

我怎样才能计算总和?我尝试过sum+=line,但它只对第一列求和。

答案1

类似的东西可以完成这项工作:

awk 'BEGIN {sum=0} {for (i = 1; i <= NF; i++) sum+=$i} END {print sum}' FileInput.txt

答案2

您的代码存在双重问题:

  1. awk它实际上并不像通常那样使用。它显式地循环块中的文件行BEGIN。这不是人们通常编写awk程序的惯用方式,即为每个输入记录(行)执行的块提供(可选)模式或条件。
  2. 由于输入由具有多个数字的记录(默认为单行)组成,因此您必须以将各个数字相加的方式来处理这些记录。换句话说,您不能添加20 3sum,但必须先将其拆分为203

使用 GNUawkmawk,我们可以将记录分隔符 , 设置RS为匹配任何空白字符序列而不是默认换行符的正则表达式。这使得将awk文件读取为空格分隔的单字段记录的集合。将这些求和并在最后打印总和就很简单了:

$ awk -v RS='[[:space:]]+' '{ sum += $1 } END { print sum }' FileInput.txt
168

或者,

$ awk 'BEGIN { RS = "[[:space:]]+" } { sum += $1 } END { print sum }' FileInput.txt
168

或者,你可以做一些变体罗密欧·尼诺夫展示了什么,即循环遍历每一行的字段,

$ awk '{ for (i = 1; i <= NF; ++i) sum += $i } END { print sum }' file
168

答案3

您可以转换文件,以便每行只有一个数字:

tr -s '[:blank:]' '\n' < FileInput.txt

然后从中选择一个解决方案https://stackoverflow.com/q/2702564/7552对它们进行总结。例如

tr -s '[:blank:]' '\n' < FileInput.txt | perl -nle '$sum += $_ } END { print $sum'

相关内容