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
我有一个名为 (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