AWK 如何计算总和

use*_*922 3 awk

输入文件(FileInput.txt):

10 20 3 100 5 3 27

这是我的 awk 脚本:

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

我如何计算总和?sum+=line但是我尝试过它只对第一列求和。

Rom*_*nov 6

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

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

  • 不严格要求初始化总和,但有利于可维护性。 (3认同)

Kus*_*nda 5

您的代码存在双重问题:

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

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

$ awk -v RS='[[:space:]]+' '{ sum += $1 } END { print sum }' FileInput.txt
168
Run Code Online (Sandbox Code Playgroud)

或者,

$ awk 'BEGIN { RS = "[[:space:]]+" } { sum += $1 } END { print sum }' FileInput.txt
168
Run Code Online (Sandbox Code Playgroud)

或者,您可以对Romeo Ninov 显示的内容进行一些变体,即循环遍历每一行的字段,

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