Программа AWK, чтобы найти среднее количество осадков в трех штатах - PullRequest
3 голосов
/ 17 октября 2010

Я хочу найти среднее количество осадков в любых трех штатах, скажем, CA, TX и AX за определенный месяц с января по декабрь.Данный входной файл ограничен 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

. Я хочу сделать следующее: «Получить сумму среднего количества осадков, скажем, за определенный месяц, февраль, например, за 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и не вижу вывод.

Вопрос: Куда я направляюсь? Будем благодарны за любые предложения и измененный код

Ответы [ 2 ]

3 голосов
/ 17 октября 2010

Шаблон /^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
2 голосов
/ 17 октября 2010

Ваше регулярное выражение должно быть

/ 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 $ / соответствует, только если это единственное слово в строке

HTH!

РЕДАКТИРОВАТЬ

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