awk 打印行组的总和

awk print sum of group of lines

我有一个名为 (effect) 的文件,其中的行由空行分隔,

(effect)
    1
    1
    1
    
    (effect)
    1
    1
    1
    1
    
    
    (effect)
    1
    1

我知道如何打印像这样的列的总和

awk  '{sum+=;} END{print sum;}' file.txt

如何使用 awk 在 for 循环中打印每个(效果)的总和?这样我在其他情况下有三行或多行,如下所示

sum=3
 sum=4
 sum=2

使用您显示的示例,请尝试以下 awk 代码。在 GNU awk.

中编写和测试
awk -v RS='(^|\n)?\(effect\)[^(]*' '
RT{
  gsub(/\(effect\)\n|\n+[[:space:]]*$/,"",RT)
  num=split(RT,arr,ORS)
  print "sum="num
}
'  Input_file

解释: 简单的解释就是,使用 GNU awk。在 awk 程序中,将 RS 设置为整个 Input_file 的 (^|\n)?\(effect\)[^(]* 正则表达式。在主程序中检查条件,如果 RT 不为 NULL,则使用 gsub(全局替换)函数替换 (effect)\n\n+[[:space:]]*$(新行后跟值末尾的空格)在 RT 中为 NULL。然后将 RT 的值拆分为带有 ORS 分隔符的名为 arr 的数组,并将其(总内容值或数组长度值)保存到名为 num 的变量中,然后打印 sum=在此处使用 num 的值以获得所需的结果。

使用所示示例,输出如下:

sum=3
sum=4
sum=2

你可以检查是否有(effect)部分,遇到(effect)部分或在END块中打印总和。

awk '
 == "(effect)" { if(seen) print "sum="sum; seen = 1; sum = 0 }
/[0-9]/ { sum +=  }
END { if (seen) print "sum="sum }
' file

输出

sum=3
sum=4
sum=2

这应该适用于 awk 的任何版本:

awk '{sum += } [=10=]=="(effect)" && NR>1 {print "sum=" sum; sum=0} 
END{print "sum=" sum}' file

sum=3
sum=4
sum=2

类似于@Ravinder 的回答,但不依赖于 header 的名称:

awk -v RS='' -v FS='\n' '{
    sum = 0
    for (i=2; i<=NF; i++) sum += $i
    printf "sum=%d\n", sum
}' file

RS='' 表示 2 个或更多换行符的序列分隔记录。
字段分隔符是换行符。
for 循环省略字段 #1,即 header.

然而,这意味着空行确实需要为空:不允许有空格或制表符。如果您的数据可能有包含空格的空行,您可以设置

-v RS='\n[[:space:]]*\n'
$ awk -v RS='(effect)' 'NR>1{sum=0; for(i=1;i<=NF;i++) sum+=$i; print "sum="sum}' file

sum=3
sum=4
sum=2