2013-02-22 39 views
0

我在使用awk計算特定的文本標識符列中的特定數字的平均值時遇到了麻煩。我有兩列數據,我試圖開始平均鍵入一個重複的公共標識符,即01/1991。因此,awk應該計算從1991年1月1日開始的所有行的平均值,重複使用下一行21行,總行數爲平均值= 22,總計1991 - 2012年。所需的輸出,平均每個文本ID /名稱條目的所有月份的(01)爲每年1991年至2012年顯示如下:Awk Calc平均行低於某些行

文本ID /名稱1 均價:50.34 文本ID /名稱2 均價:45.67 TEXTID /名稱3 平均:39.97 ...

樣本數據:

TextID/Name 1 
01/1991, 57.67 
01/1992, 56.43 
01/1993, 49.41 
.. 
01/2012, 39.88 
TextID/Name 2 
01/1991, 45.66 
01/1992, 34.77 
01/1993, 56.21 
.. 
01/2012, 42.11 
TextID/Name 3 
01/1991, 32.22 
01/1992, 23.71 
01/1993, 29.55 
.. 
01/2012, 35.10 
continues with the same data for TextID/Name 4 

我得到使用此代碼的答案如下所示,但平均開始以計算特定標識符行之前和不在該線以下(01/1991)。

awk '$1="01/1991" {sum+=$2} (NR%22==0){avg=sum/22;print"Average: "avg;sum=0;next}' myfile 

感謝和解釋的解決方案,非常感謝!我用更多描述編輯了原始答案 - 再次感謝你。

+0

我覺得你想'awk'$ 1 ==「....'。'$ 1 =」xxx「'分配給字段1。祝你好運。 – shellter 2013-02-22 21:55:24

+0

感謝您的回覆,但是當我計算所有零時的平均值 – user2100039 2013-02-22 21:59:27

+0

關於'$ 1 =「01/1991」的另一件事是,因爲它是一個賦值,它將始終爲真,並且所有記錄都將處理'sum + = $ 2'。如果你充實了你的現在我們不知道爲什麼你選擇了22(我可以猜到),更重要的是,我們不知道你想要的輸出,也沒有你現有輸出的真實圖像,或者你可以添加一些打印語句所有的變量都可以自己調試問題,祝你好運。 – shellter 2013-02-22 22:49:25

回答

0

如果你被允許使用Perl,而不是awk中,你可以這樣做:

#!/usr/bin/env perl 

$start = 0; 
$have_started = 0; 
$count = 0; 
$sum = 0; 

while (<>) { 
    $line = $_; 

    # Grab the value after the date and comma 
    if ($line = /\d+\/\d+,\s+([\d\.]+)/) { 
    $val = $+; 
    } 

    # Start summing values after 01/1991 
    if (/01\/1991,\s+([\d\.]+)/) { 
    $have_started = 1; 
    $val = $+; 
    } 

    # If we have started counting, 
    if ($have_started) { 
    $count++; 
    $sum += $+; 
    } 
} 

print "Average of all values = " . $sum/$count; 

運行它,就像這樣:

$ cat your-text-file.txt | above-perl-script.pl 
1

如果你看一下你的文件,第一場是「01/1991」,最後用逗號,而不是「01/1991」。此外,NR%22 == 0將查看可以被22整除的行號,而不是22行後它認爲你關心的點。

你可以做這樣的事情,而不是:

awk ' 
    BEGIN { l=-1; } 
    $1 == "01/1991," { 
    l=22; 
    s=0; 
    } 

    l > 0 { s+=$2; l--; } 
    l == 0 { print s/22; l--; }' 

它有它設置爲行數數的計數器1,那麼其總結了該行數。

您可能想要考慮簡單地總結從01/1991到下一個的所有行,這可能更加健壯。