В неинтерактивном awk некоторые данные отсутствуют

Я запускаю команду awk в сценарии оболочки, и он разбивает файл данных. Все данные не загружаются, и в конце каждой строки есть символ новой строки.

awk -v name="$filename" -v batch="$BATCHNAME" -F'|' 'BEGIN{OFS="|"}{$2=batch;print > (name".locked.concur")}' $filename.locked.concur

Если я запускаю это как команду, она работает отлично.

Я только что обнаружил, что могу использовать fflush(), и, похоже, это решило проблему.

Итак, теперь у меня есть:

awk -v name="$filename" -v batch="$BATCHNAME" -F'|' 'BEGIN{OFS="|"}{$2=batch;print > (name".locked.concur") fflush()}' $filename.locked.concur

Я готовлюсь к катастрофе?

Кроме того, файл переименован в $filename.locked.concur0 - я предполагаю, что этот ноль является кодом выхода, который возвращается из fflush? Как мне избавиться от этого 0?

полный код:

for filename in `cat ${INFILEDIR}/file_list_concur`

do

rm -f $OHAP_DAT/bad/$filename.bad

##Create Batchname based on filename

BATCH_GROUP=`ls $filename.locked.concur |cut -d '_' -f 1`
BATCH_DATE=`ls $filename.locked.concur |cut -d '_' -f 2`
BATCHNAME=${BATCH_GROUP}_Concur_${BATCH_DATE}

echo 'Batch Date = '$BATCH_DATE
echo 'Batch Group = '$BATCH_GROUP
echo 'Batch Name = '$BATCHNAME
echo 'File Name = ' $filename

gawk -v name="$filename" -v batch="$BATCHNAME" -F'|' 'BEGIN{OFS="|"}{$2=batch;print > (name".locked.concur");}' $filename.locked.concur


##End Batchname

sqlldr $ORACLE_PW control=$XXOH_TOP/bin/XXOH_AP_CONCUR_IMPORT_CTL.ctl \
              data=$OHAP_DAT/in/$filename.locked.concur \
              log=$OHAP_DAT/log/$filename.log \
              bad=$OHAP_DAT/bad/$filename.bad \
                bindsize=512000 << end_of_sqlldr
end_of_sqlldr

if [ -f $OHAP_DAT/bad/$filename.bad ]
then
  echo \!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  echo \!! 'date'
  echo \!! SQL*Loader bad file was found!!
  echo \!! Script $filename Failed - BAD FILE!
  echo \!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

1 ответ

Решение

Проблема действительно в том, что вы читаете и пишете в один и тот же файл. это должно работать лучше:

gawk ... print > (name".locked.concur.tmp")}' $filename.locked.concur
mv -f $filename.locked.concur.tmp $filename.locked.concur

еще лучше:

gawk ... print}' $filename.locked.concur > $filename.locked.concur.tmp
mv -f $filename.locked.concur.tmp $filename.locked.concur
Другие вопросы по тегам