проблема с тем, что элементы массива в awk не сохраняются

Я использую awk для обработки почасовых данных о погоде, сохраняя 10 массивов с 8784 элементами данных. Если массив неполный, т.е. останавливается на 8250 и т.д., то после команды "КОНЕЦ" я заполняю оставшиеся элементы массива последним доступным для массива значением. Однако, когда я затем распечатываю полные массивы, вместо этого я получаю 0 для заполненных значений. Чем это вызвано?? Есть ли у awk ограничение на размер массива, которое мешает ему заполнять массивы? Ниже приведен фрагмент программы awk. В двух операторах печати в первый раз элементы массива заполнены, но во второй раз они пусты.

Любая помощь приветствуется, потому что эта проблема задерживает мою работу.

Джо Хуанг

END{
if (lastpresstime < tothrs)
   {
   diffhr = tothrs - lastpresstime
   for (i=lastpresstime+1;i<=tothrs+1;i++)
      {
      xpressinter[i]=diffhr
      xpressrecords[i]=diffhr
      xipress[i]=lastpress
      xpressflag[i]="R"
      printf("PRS xipress[%4d] =%6.1f\n",i,xipress[i]) > "ncdcfm3.prs"
      printf(" xipress[%4d] =%6.1f%1s\n",i,xipress[i],xpressflag[i])
      }
   for (i=1;i<=tothrs+1;i++) printf("PRS xipress[%4d] =%6.1f\n",i,xipress[i]) 
   }

~


person Community    schedule 05.08.2009    source источник
comment
Есть 3 оператора printf. Какая проблема? Пожалуйста, переформатируйте вопрос, используя теги ‹pre›.   -  person William Pursell    schedule 05.08.2009


Ответы (2)


У меня нет представителя, чтобы отредактировать ваш пост, но вот отформатированный код:

END {
    if (lastpresstime < tothrs) {
        diffhr = tothrs - lastpresstime
        for (i=lastpresstime+1;i<=tothrs+1;i++) {
            xpressinter[i]=diffhr
            xpressrecords[i]=diffhr
            xipress[i]=lastpress
            xpressflag[i]="R"
            printf("PRS xipress[%4d] =%6.1f\n",i,xipress[i]) > "ncdcfm3.prs"
            printf(" xipress[%4d] =%6.1f%1s\n",i,xipress[i],xpressflag[i])
        }
        for (i=1;i<=tothrs+1;i++)
            printf("PRS xipress[%4d] =%6.1f\n",i,xipress[i])
    }
}

Обратите внимание, что я добавил соответствующую фигурную скобку в конце.

Я не вижу каких-либо внутренних проблем в коде, поэтому, как и в случае с jhartelt, я должен спросить: все ли переменные определены правильно? Из этого примера мы не можем сказать, как lastpresstime, tothrs и lastpress получают свои значения. В частности, если lastpress нет, вы получите именно то поведение, которое вы описали. Обратите внимание, что если вы допустили ошибку, это будет неопределенная переменная, и поэтому используйте значение по умолчанию, равное 0.

Что касается комментария Уильяма Перселла, также не должно быть различий в выводе xipress[i] между тремя printfs (для lastpresstime<i).

person Cascabel    schedule 05.08.2009

Поскольку 0 является значением по умолчанию для неизвестной/неиспользуемой числовой переменной, я хотел бы спросить, уверены ли вы, что в именах переменных, используемых в блоке END, нет опечаток?

person Juergen Hartelt    schedule 05.08.2009