[英]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.