Входными данными для этого задания является огромный файл .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-файла.
предоставить способ узнать, на какой строке происходит сбой?
Это тоже довольно много кода. Пожалуйста, публикуйте только ту часть, которая имеет отношение к проблеме.
Вы уверены, что используете Linux? Я не думаю, что версия awk для Linux выводит это сообщение об ошибке, это версия AIX.
Вместо захвата stderror просто проверьте, что в строке указано правильное количество полей. (NF >= 19)
>>$log_dir$log_fname
не работает внутри awk
скрипта. См. stackoverflow.com/questions/19075671/…, чтобы узнать, как использовать переменные оболочки внутри awk-скрипта.
Номер плохой строки указан в этом сообщении: The input line number is 3.567832e+04.
Что довольно странно, потому что это 35678.32
, а номера строк не могут быть дробными.
@barmar, ты прав. это AIX
while... read line... do awk '....' является антишаблоном.
правильный номер строки обновлен до 3.87172e+07. не решается расшифровать при формировании вопроса. извините за неудобства.
Вызов awk один раз для каждой строки в цикле чтения во время чтения очень похож на ситуацию, когда вы купили машину, чтобы добраться до работы, а затем каждый день возили ее туда и обратно на работу. Однозначно не делайте этого! Ваш скрипт должен выполняться вечно, и в нем есть проблемы, с которыми вам может помочь шеллчек.
Подождите... вы не передаете "$line"
в awk, чтобы while read
прочел первую строку ввода, а затем awk
прочел остальную часть, так что вы на самом деле не вызываете awk по одной строке за раз, но awk не увидит первую строка ввода. Избавьтесь от while read
, а затем, если вы не хотите, чтобы awk что-либо делал с первой строкой ввода, добавьте NR==1{next}
в начало сценария awk.
Спасибо @Barmar, ваша ссылка на использование переменной Shel может помочь многим понять и решить проблему.
Поскольку файл очень большой и awk выдает номер строки в экспоненциальном формате, он не будет указывать точный номер строки во входном файле, но почти он дает его при округлении числа.
Добавьте проверку правильности количества полей в скрипт 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
.
этот awk ежедневно пишет похожую ошибку stderr, даже несмотря на то, что $rc равен 0. Я изо всех сил пытаюсь понять, почему awk пишет ненулевой код через день, в то время как stderr аналогичен ежедневно. и номер строки, который я проверил. понятия не имею, это просто случайная строка, такая же, как 9150,D,03312024,01,FCT,M,Y,1,1
@Barmar О, да, ты прав. Если я не ошибаюсь, номера строк всегда должны быть целыми числами. не должны ли они? Таким образом, кажется, что 35678,32 не может быть правильным номером строки, если только .32 не означает что-то другое в этом контексте, например номер столбца или что-то в этом роде.
@Barmar, номер строки теперь обновлен правильно. пожалуйста, рассмотрите 3.87172e+07
Переменные оболочки $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)
...
'
Обновлено: с тех пор вопрос был отредактирован, хотя и непоследовательно.
Пожалуйста, опубликуйте сценарий с проблемой, а не описывайте внесенные вами изменения, которые вызвали проблему.