3

1 月から 12 月までの特定の月の CA、TX、AX という 3 つの州の平均降水量を見つけたいと考えています。で区切られた入力ファイルTAB SPACESの形式は city name, the state , and then average rainfall amounts from January through December, and then an annual average for all months. EGは次のように見える場合があります

AVOCA   PA  30  2.10    2.15    2.55    2.97    3.65    3.98    3.79    3.32     3.31   2.79    3.06    2.51    36.18
BAKERSFIELD CA  30  0.86    1.06    1.04    0.57    0.20    0.10    0.01    0.09    0.17    0.29    0.70    0.63    5.72

私がやりたいことは、「たとえば特定の月 2 月の平均降雨量の合計を n 年間にわたって取得し、次に CA、TX、および AX 州の平均を見つけることです。

同じことを行うために awk で以下のスクリプトを作成しましたが、期待される出力が得られません

/^CA$/ {CA++; CA_SUM+= $5} # ^CA$ - Regular Expression to match the word CA only 
/^TX$/ {TX++; TX_SUM+= $5} # ^TX$ - Regular Expression to match the word TX only  
/^AX$/ {AX++; AX_SUM+= $5} # ^AX$ - Regular Expression to match the word AX only 
END {
     CA_avg = CA_SUM/CA;
     TX_avg = TX_SUM/TX;
     AX_avg = AX_SUM/AX; 
     printf("CA Rainfall: %5.2f",CA_avg);
     printf("CA Rainfall: %5.2f",TX_avg);
     printf("CA Rainfall: %5.2f",AX_avg);
    }

コマンドを使用してプログラムを起動しましたが、 awk 'FS="\t"'-f awk1.awk rainfall.txt出力が表示されません。

質問: どこで滑っていますか? 任意の提案と変更されたコードをいただければ幸いです

4

2 に答える 2

3

このパターン/^CA$/は、文字「C」と「A」が行の唯一の文字であることを意味します。あなたがしたい:

$2 == "CA" {CA++; CA_SUM+= $5}
# etc.

ただし、これは DRYer です。

{ count[$2]++; sum[$2] += $5 }
END {
    for (state in count) {
        printf("%s Rainfall: %5.2f\n", state, sum[state]/count[state])
    }
}

また、これは間違っているようです:awk 'FS="\t"'-f awk1.awk rainfall.txt
試してください:awk -F '\t' -f awk1.awk rainfall.txt


コメントへの対応:

awk -F '\t' -v month=2 -v states="CA,AZ,TX" '
    BEGIN {
        month_col = month + 3  # assume January is month 1
        split(states, wanted_states, /,/)
    }
    { count[$2]++; sum[$2] += $month_col }
    END {
        for (state in wanted_states) {
            if (state in count) {
                printf("%s Rainfall: %5.2f\n", state, sum[state]/count[state])
            else
                print state " Rainfall: no data"
        }
    }
' rainfall.txt
于 2010-10-16T23:55:10.207 に答える
2

あなたの正規表現は

/ CA / {CA++; cA_SUM+= $5} # ^CA$ - Regular Expression to match the word CA only 
/ TX / {TX++; TX_SUM+= $5} # ^TX$ - Regular Expression to match the word TX only  
/ AX / {AX++; AX_SUM+= $5} # ^AX$ - Regular Expression to match the word AX only 

/^AX$/ は、行内の唯一の単語である場合にのみ一致します

チッ!

編集

/ CA / {CA++; CA_SUM+= $5} # ^CA$ - Regular Expression to match the word CA only 
/ TX / {TX++; TX_SUM+= $5} # ^TX$ - Regular Expression to match the word TX only  
/ AX / {AX++; AX_SUM+= $5} # ^AX$ - Regular Expression to match the word AX only 
END {

 if(CA!=0){CA_avg = CA_SUM/CA;     printf("CA Rainfall: %5.2f",CA_avg);}
 if(TX!=0){TX_avg = TX_SUM/TX;     printf("TX Rainfall: %5.2f",TX_avg);}
 if(AX!=0){TX_avg = AX_SUM/CA;     printf("AX Rainfall: %5.2f",AX_avg);}
}
于 2010-10-16T21:13:06.407 に答える