Невозможно зафиксировать ошибочный номер записи при обработке огромного текстового файла

Входными данными для этого задания является огромный файл .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 = "$?"
 

Однако я внес незначительные изменения в этот скрипт, чтобы зафиксировать стандартную ошибку, возвращаемую из awk, с помощью этого ' 2>>$log_dir$err_fname и записать ее в собственный файл ошибок.

Но не удалось определить, для какой записи awk пишет стандартную ошибку. необходимо захватить эту входную строку среди огромного количества строк из входного txt-файла.

предоставить способ узнать, на какой строке происходит сбой?

Пожалуйста, опубликуйте сценарий с проблемой, а не описывайте внесенные вами изменения, которые вызвали проблему.

Barmar 05.04.2024 19:27

Это тоже довольно много кода. Пожалуйста, публикуйте только ту часть, которая имеет отношение к проблеме.

Barmar 05.04.2024 19:28

Вы уверены, что используете Linux? Я не думаю, что версия awk для Linux выводит это сообщение об ошибке, это версия AIX.

Barmar 05.04.2024 19:32

Вместо захвата stderror просто проверьте, что в строке указано правильное количество полей. (NF >= 19)

Barmar 05.04.2024 19:35
>>$log_dir$log_fname не работает внутри awk скрипта. См. stackoverflow.com/questions/19075671/…, чтобы узнать, как использовать переменные оболочки внутри awk-скрипта.
Barmar 05.04.2024 19:40

Номер плохой строки указан в этом сообщении: The input line number is 3.567832e+04.

Barmar 05.04.2024 19:59

Что довольно странно, потому что это 35678.32, а номера строк не могут быть дробными.

Barmar 05.04.2024 19:59

@barmar, ты прав. это AIX

Mahesh 05.04.2024 20:06

while... read line... do awk '....' является антишаблоном.

Kaz 05.04.2024 20:06

правильный номер строки обновлен до 3.87172e+07. не решается расшифровать при формировании вопроса. извините за неудобства.

Mahesh 05.04.2024 20:22

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

Ed Morton 07.04.2024 13:17

Подождите... вы не передаете "$line" в awk, чтобы while read прочел первую строку ввода, а затем awk прочел остальную часть, так что вы на самом деле не вызываете awk по одной строке за раз, но awk не увидит первую строка ввода. Избавьтесь от while read, а затем, если вы не хотите, чтобы awk что-либо делал с первой строкой ввода, добавьте NR==1{next} в начало сценария awk.

Ed Morton 07.04.2024 13:25

Спасибо @Barmar, ваша ссылка на использование переменной Shel может помочь многим понять и решить проблему.

Mahesh 08.04.2024 02:30

Поскольку файл очень большой и awk выдает номер строки в экспоненциальном формате, он не будет указывать точный номер строки во входном файле, но почти он дает его при округлении числа.

Mahesh 12.04.2024 10:57
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
14
95
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Добавьте проверку правильности количества полей в скрипт 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'

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

3.567832e+04 это 35678.32.
Barmar 05.04.2024 20:01

этот awk ежедневно пишет похожую ошибку stderr, даже несмотря на то, что $rc равен 0. Я изо всех сил пытаюсь понять, почему awk пишет ненулевой код через день, в то время как stderr аналогичен ежедневно. и номер строки, который я проверил. понятия не имею, это просто случайная строка, такая же, как 9150,D,03312024,01,FCT,M,Y,1,1

Mahesh 05.04.2024 20:05

@Barmar О, да, ты прав. Если я не ошибаюсь, номера строк всегда должны быть целыми числами. не должны ли они? Таким образом, кажется, что 35678,32 не может быть правильным номером строки, если только .32 не означает что-то другое в этом контексте, например номер столбца или что-то в этом роде.

Travis Shands 05.04.2024 20:17

@Barmar, номер строки теперь обновлен правильно. пожалуйста, рассмотрите 3.87172e+07

Mahesh 05.04.2024 20:19
Ответ принят как подходящий

Переменные оболочки $log_dir и $log_fname не заменяются в кавычках. Используйте опцию awk -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)
    ...
'

Обновлено: с тех пор вопрос был отредактирован, хотя и непоследовательно.

Другие вопросы по теме