我想找到任何三个州的平均降雨量,即CA,TX和AX的特定月份,从1月至12月。给定输入文件由 TAB SPACES 并具有格式city name, the state , and then average rainfall amounts from January through December, and then an annual average for all months. 。例如看起来像

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

我想做的是“要在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 并且没有输出。

问题:我在哪里滑?任何建议和更改的代码将不胜感激

有帮助吗?

解决方案

您的言论应该是

/ 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);}
}

其他提示

图案 /^CA$/ 表示字符“ C”和“ A”是行上唯一的字符。你要:

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

但是,这是干衣机:

{ 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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top