2014-10-27 92 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