Обновить последнее поле значением из числа строк (awk?)
У меня есть файл с разделителями трубы (file.001), как показано ниже:
00|FIELD10|FIELD02
01|FIELD01|FIELD02|FIELD03
01|FIELD01|FIELD02|FIELD03
01|FIELD01|FIELD02|FIELD03
01|FIELD01|FIELD02|FIELD03
99|4
Строки, начинающиеся с '01', являются записями (00 = заголовок, 99 = трейлер). Последнее поле в трейлере (в настоящее время заполнено '4') - это количество записей, однако это количество записей не всегда точное.
То, что я хочу сделать, это подсчитать количество записей и обновить поле счетчика записей, оставив остальную часть данных нетронутой (печать в новый файл будет в порядке, в идеале это будет в том же файле). Моя интерпретация этого состоит в том, чтобы напечатать значение счетчика в последнем значении поля, но я не знаю, как это сделать.
Я пытался сделать это с помощью awk, и в настоящее время у меня есть следующее для печати счетчика и последнего поля:
Распечатать количество записей:
awk '/^01/ {count++} END {print count }' file.001
Напечатать последнее поле:
awk 'BEGIN {RS="|"}; END {print ($(NF))}' file.001
Может ли кто-нибудь предложить предложение о том, как это сделать? Я новичок в awk, поэтому извиняюсь, если то, что я имею выше, пока не очень хорошо. Я также открыт для использования чего-то другого, кроме awk, для достижения этой цели.
1 ответ
Учитывая ваш первый awk
Скажите, я удивлен, что вы не использовали что-то подобное для печати последнего поля (количество записей):
awk -F '|' '/^99/ { print $NF }' file
"Трейлер" всегда начинается с "99", правильно? Таким образом, вы можете использовать это для внесения желаемых изменений в ваш файл. Возможно, попробуйте следующее:
awk 'BEGIN { OFS=FS="|" } $1 == "01" { c++ } $1 == "99" { $2 = c }1' file
Если у вас есть последние gawk
Вы можете использовать редактирование на месте:
gawk -i inplace '...' file
Обратите внимание, что это так же, как:
gawk '...' file > file.tmp && mv file.tmp file