2010-10-16 3 views
3

Я хочу найти среднее количество осадков в трех штатах, скажем 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 может выглядетьПрограмма AWK, чтобы найти среднее количество осадков в трех штатах

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 

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

Вопрос: Где я проскальзываю? Любые предложения и измененный код будет оценено

+0

Вы еще не точно описали свои данные; содержание столбца 3, по-видимому, не является количеством осадков. Непонятно, как вы относитесь к городу с двумя словами от его имени (Mountain View, Atlantic City). –

ответ

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

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);} 
} 
+0

@belisarius - не работает - я больше не вижу выхода. –

+0

@Внешняя попытка восстановления вашей FS с линии comand –

+0

@belisarius: дает мне деление на нулевую ошибку –

3

Шаблон /^CA$/ означает символы "C" и "А" являются единственными символами на линии. Вы хотите:

$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 
+1

+1 для более общего решения и упоминания СУХОЙ в контексте дождя. – schot

+0

+1 Гораздо лучше, чем у меня. Я думал только об исправлении ошибок ОП, что порождает всегда близорукий ответ. Вы можете улучшить его немного больше, разрешив параметр в командной строке для номера месяца. Только мои 2 цента. –

+0

Вы можете изменить версию DRY, чтобы выбрать определенные состояния: 'awk -v statelist =" AK CA TX "'match (statelist, $ 2) {count [$ 2] ++; sum [$ 2] + = $ 5} ... '. Или используйте переменную оболочки вместо буквенного 'states =" AK CA TX "; awk -v statelist = $ states '...' ' –

Смежные вопросы