В неинтерактивном 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