Обновить последнее поле значением из числа строк (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
Другие вопросы по тегам