繁体   English   中英

Linux Shell脚本-简单的AWK脚本问题

[英]Linux shell scripting - Simple awk script issue

我正在尝试做一个非常简单的awk脚本练习,无法弄清楚为什么它不起作用。

应该使用awk脚本仅显示以2012开头的条目,因此请提供以下输入文件:

  2009 Dec X 29.44
  2009 Dec Y 32.32
  2012 Jan X 321.11
  2012 Feb Y 1.99
  2012 Feb X 32.99
  2012 Mar X 11.45
  2010 Jan X 14.75
  2011 Feb Y 21.00
  2011 Mar X 7.77

输出应如下所示:

 % awk -f awkscriptfile inputfile
  Data for year 2012
  ==================
  Jan : 321.11
  Feb : 1.99
  Feb : 32.99
  Mar : 11.45
  ===================
  volume for 2012 is: 367.54
  4 records processed
  %

但是,我得到的是:

% awk -f awkscriptfile inputfile
    Data for year 2012
    ==================================
     2009 Dec X 29.44
     2009 Dec Y 32.32
     2012 Jan X 321.11
    Jan  :  321.11
     2012 Feb Y 1.99
    Feb  :  1.99
     2012 Feb X 32.99
    Feb  :  32.99
     2012 Mar X 11.45
    Mar  :  11.45
     2010 Jan X 14.75
     2011 Feb Y 21.00
     2011 Mar X 7.77
    ==================================
    volume for 2012 is: $sum
    $count records processed
%

因此,awk脚本显然比预期的要打印得多,并且由于某种原因,总和和计数变量没有被打印。

这是我的awk脚本代码:

BEGIN {
 print "Data for year 2012"
 print "=================================="
 count = 0
 sum = 0
}
$1 ~ /2012/ {
 print $2, " : ", $4
 count++
 sum += $4
}
END {
 print "=================================="
 print "volume for 2012 is: $sum"
 print "$count records processed"
}

从我正在寻找的所有参考资料中,我看不出为什么该代码不起作用。 希望其他人可以告诉我我做错了什么。

awk -v y="2012" '$1==y{a[NR]=$2":"$4;s+=$4;c++}
    END{line="===================";
    printf "Data for year %s\n%s\n",y,line;
    for(i=1;i<=NR;i++)if(a[i])print a[i]
    printf "%s\nvolume for %s is: %.2f\n%d records processed\n", line, y, s, c}' file

与您的数据一起,它输出:

Data for year 2012
===================
Jan:321.11
Feb:1.99
Feb:32.99
Mar:11.45
===================
volume for 2012 is: 367.54
4 records processed

这是脚本的修改版本

输入

akshay@Aix:/tmp$ cat infile
  2009 Dec X 29.44
  2009 Dec Y 32.32
  2012 Jan X 321.11
  2012 Feb Y 1.99
  2012 Feb X 32.99
  2012 Mar X 11.45
  2010 Jan X 14.75
  2011 Feb Y 21.00
  2011 Mar X 7.77

脚本

akshay@Aix:/tmp$ cat stat_data.awk
BEGIN{

    if( ARGC < 2 || year=="")
    {
        error=1
        print "\n\t\tUsage   : awk -vyear=<year> -f script.awk <input file>"
        print "\t\tExample : awk -vyear=2012 -f script.awk test.txt\n"
        exit
    }

        print "Data for year "year
        print "=================================="

}
$1==year{
        print $2":"$4
        sum+=$4
        count++
}
END{
     if(!error)
     {
        print "=================================="
        print "volume for "year" is: "sum
        print count" records processed"
     }
}

如何执行?

akshay@Aix:/tmp$ awk -vyear=2012 -f stat_data.awk  infile

产量

Data for year 2012
==================================
Jan:321.11
Feb:1.99
Feb:32.99
Mar:11.45
==================================
volume for 2012 is: 367.54
4 records processed

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM