输入文件(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
您的代码存在双重问题:
awk
它实际上并不像通常那样使用。它显式地循环块中的文件行BEGIN
。这不是人们通常编写awk
程序的惯用方式,即为每个输入记录(行)执行的块提供(可选)模式或条件。- 由于输入由具有多个数字的记录(默认为单行)组成,因此您必须以将各个数字相加的方式来处理这些记录。换句话说,您不能添加
20 3
到sum
,但必须先将其拆分为20
和3
。
使用 GNUawk
或mawk
,我们可以将记录分隔符 , 设置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'