【问题标题】:Awk statement generating extra output line; skip blank input linesawk 语句生成额外的输出行;跳过空白输入行
【发布时间】:2015-10-10 23:26:57
【问题描述】:
jon,doe          5        5      
sam,smith       10        5      

我需要计算行和列的平均值。所以基本上输入文件包含名称 score1 和 score2 ,我需要从文件中读取内容,然后计算平均行和列。我得到了想要的结果,但是由于空白,我得到了一个额外的'0',如果有人可以提供帮助,我将不胜感激。

awk 'BEGIN {print "name\tScore1\tScore2\tAverage"} {s+=$2} {k+=$3} {print $1,"\t",$2,"\t",$3,"\t",($2+$3)/2} END {print "Average", s/2,k/2}' input.txt

这是我得到的输出-

name           Score1  Score2   Average
jon,doe          5        5      5
sam,smith       10        5      7.5
                                 0
Average         7.5       5   

【问题讨论】:

  • 有没有人能解释一下为什么要这样写{s+=$2} {k+=$3}
  • @HuStmpHrrr 这是一项任务。我们将 $2 和 $3 中的任何内容分别存储在 s 和 k 中
  • 我想知道为什么不{s+=$2; k+=$3}?如果没有额外的优点,它看起来很奇怪
  • @HuStmpHrrr 你也可以这样做。我正在学习,我想我会努力学习。

标签: linux awk


【解决方案1】:

您的输入文件中似乎有一个额外的空行或空白(全空白)行。

添加NF==0 {next} 作为第一个模式-动作对将跳过所有空行或空行并给出所需的结果。

NF==0 仅在输入行中未找到任何字段(数据)时匹配。
next 语句跳过当前输入行(记录)的剩余语句并继续处理下一行(记录)。

awk 'BEGIN {print "name\tScore1\tScore2\tAverage"} NF==0 {next} {s+=$2} {k+=$3} {print $1,"\t",$2,"\t",$3,"\t",($2+$3)/2} END {print "Average", s/2,k/2}' input.txt

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多