2017-02-02 5 views
2

Реформирование файлов для загрузки в базу данных. Подробная информация о файлах приведена ниже кода.awk для значения инкремента цикла

Что я до сих пор. Все работает, за исключением вычисления часа.

awk 'BEGIN{ FS="|" ; OFS="\t" }; 
    { for (i = 4; i < NF; i=i+2) {   
# +2 Because need to walk row in pairs of QC/Value(s) 
     if (NF == 52) { 

      hour = (i - 2)/2 
# Need the value of i, not what is stored in position i. 

      qualitycode = i  
      value = i + 1 
      print ($1,$2,$3,$hour,$qualitycode,$value) 
     } else { 
      print ("ERROR",$NR,$0)   
     } 
    } 
}' $origfile > $tempfile 

cat $tempfile | grep ERROR > $errfile 

cat $tempfile | grep -v ERROR > $newfile 

Как я могу получить значение из я вместо того, что хранится «в» положении I?

В случае, если вас это интересует.

Оригинальные файлы данных в этом формате:

Module|Sensor|Date|QC1|Value1|QC2|Value2|QC3|Value3|......|QC23|Value23|QC24|Value24| 
90123|PQRST|20161015|4|12.45|4|11.23|4|10.40|4|9.89|......|4|21.36|4|20.55| 
65432|BCDEF|20161015|4|6.45|4|7.51|2|9.01|4|11.74|.....|4|18.92|4|16.4| 
.....many more rows 

Существует более чем один модуль, и каждый модуль имеет более чем один датчик.

Хотела переформатировать для загрузки в базу данных:

Module\tSensor\tDate\tHour\tQC1\tValue1 
Module\tSensor\tDate\tHour\tQC2\tValue2 
Module\tSensor\tDate\tHour\tQC24\tValue24 

час, конечно, нужно увеличивать от 1 до 24 для каждого модуля/датчика/день?

+1

Вы пытались использовать 'value' и' i' вместо '$ value' и' $ i'? –

ответ

1

Я думаю, что вы сделали ошибку в операторе печати:

print $hour 

Это разыменовываются значение в час, захватывая значение поля в положении, хранящегося в hour, в то время как

print hour 

напечатает фактическое значение в переменной hour.

+0

@PartTimer Это ответ на ваш вопрос? Можем ли мы отметить это как принятое решение? – Dan

+0

Да что работает. Благодаря! – PartTimer

0

Попробуйте изменить следующее в вашем коде:

  print $1,$2,$3,hour,qualitycode,value) 
    } else { 
     print "ERROR",NR,$0 

В AWK мы не можем напечатать значения переменных, как оболочки.

0
awk -F'|' -vOFS='\t' '{ 
    d=(NF-4)/2; j=3 
    for (i=1; i<=d; ++i) { 
     print $1,$2,$3,i,"QC" i, $(j+=2) 
    } 
}' "$origfile" > "$tempfile"