2014-10-27 109 views
0

我正在尝试做一个非常简单的awk脚本练习,并且不知道为什么它不工作。Linux shell脚本 - 简单的awk脚本问题

的awk脚本应该被用来与2012 begining只显示条目,所以给出下面的输入文件:

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脚本是obvio我们打印的数量比应该多,并且出于某种原因,总和和变量变量没有被打印出来。

这是我的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" 
} 

一切从我在寻找,以供参考,我看不出有任何理由为什么这个代码不应该工作。希望别人能告诉我我做错了什么。

+3

,准确的输入,准确的剧本都没有做,在这里。你确定这是你正在使用的**剧本**吗?因为这看起来很像输出,你会得到一个杂乱的真实-y模式或调试'{print}'动作。 – 2014-10-27 16:58:26

+3

另外,您不要在变量上使用'$',并且它们不会插入字符串中。因此,最后两行希望成为2012年的“打印”卷:“sum”和“print count”记录已处理“'。 – 2014-10-27 17:00:52

+0

我实际上在脚本的开头用“//”而不是“#”开始注释,并且改变它似乎已经修复了它。我以为两个都使用shell脚本,但我猜不。你提供的变量修正当然也起作用。非常感谢! – aredscout 2014-10-27 17:10:27

回答

3
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 
1

下面是修改脚本的版本

输入

[email protected]:/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 

脚本

[email protected]:/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" 
    } 
} 

如何执行呢?

[email protected]:/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