在非交互式awk中留下一些数据丢失

问题描述:

我在shell脚本中运行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 \!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 

问题的确是你是从读取和写入同一个文件。这应该更好的工作:

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 
+0

所以补充说,分号由于某种原因被带回换行符的问题和不完整的输出。我猜在脚本继续前,缓冲区仍然有文件的其余部分。 此外,我不会在代码的前面写同一个文件,$ filename是由一个文件列表定义的,并且在我将要解析的每个新文件中发生本质上的变化。 – user2144835

+1

'fflush )'是一只红鲱鱼,你不应该在这里需要它。通过添加它而不用分号,你改变了输出文件的名称,这使得它与输入文件的名称不同,这就是它开始工作的原因。你说文件名改变了,但是你显示的awk代码使用'-v'参数来始终将输出文件名设置为与输入文件名相同 - 至少这就是它的出现方式。 – jas

+0

感谢您添加其余的代码。你每次通过循环改变$ filename,但是对于任何一次,如@jas所说,你的gawk正在读取和写入同一个文件,这导致了你看到的混乱的输出。 – webb