此作业的输入是一个巨大的 .txt 文件。
#!/bin/ksh
while read -r line
do
awk ' BEGIN {FS= ","}
$2 ~ /[mM]/ {
if ($12 ~ /[1-9]+/ )
{
SECNext=$13
if ( SECNext != SECPrev )
{
SECPrev=SECNext
$3=substr($3,5,4)"-"substr($3,1,2)"-"substr($3,3,2)
}
else
{
printf ("%s\t Same SEC Occured \n",$0) >>$var1$var2
}
}
else
{
printf ("%s\t No SEC for this trem\n",$0) >>$var1$var2
}
}
' 2>>$var1$var3
done<$tmp_file>$dir$file".dat"
rc="$?"
但是,我对此脚本做了一些微小的更改,以捕获使用此
' 2>>$log_dir$err_fname
从 awk 返回的标准错误,并将其捕获到自定义错误文件中。
但无法捕获 awk 正在写入哪个记录的标准错误。需要从输入 txt 文件中的大量行中捕获该输入行。
提供一种方法来知道哪一行失败了?
Shell 变量 $log_dir 和 $log_fname 不会在“引号”之间替换。使用 awk-option -v 传递值,例如:
awk -v log_dir="$log_dir" -v log_fname="$log_fname" '
...
printf ("%s\t No UPC for this item\n",$0) >>(log_dir log_fname)
...
'
编辑:此问题已被编辑,尽管不一致。
在 awk 脚本中添加对字段数量是否正确的检查。
awk ' BEGIN {FS= ","} # set a delimeter to comma
NF < 19 {printf("Line too short: Line #: %d, length: %d, contents: %s\n", NR, NF, $0) > "/dev/stderr"; nextline}
$2 ~ /[mM]/ { ### Check if it is an item level "M" ($2 - second field)
您是否尝试查看有问题的输入行?像这样的东西:
sed -n'3567832p'
假设我正确转换了科学记数法,这应该会向您显示脚本失败的确切行。