在处理巨大的文本文件时无法捕获错误的记录号[重复]

问题描述 投票:0回答:3

此作业的输入是一个巨大的 .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 文件中的大量行中捕获该输入行。

提供一种方法来知道哪一行失败了?

awk ksh
3个回答
0
投票

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)
    ...
'

编辑:此问题已被编辑,尽管不一致。


0
投票

在 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)

0
投票

您是否尝试查看有问题的输入行?像这样的东西:

sed -n'3567832p'

假设我正确转换了科学记数法,这应该会向您显示脚本失败的确切行。

© www.soinside.com 2019 - 2024. All rights reserved.