Awk — запись длины последующей строки в строку

#string #awk

#строка #авк #awk

Вопрос:

Предположим, что имеется текстовый файл, состоящий из чередующихся строк. В частности, строка 1 каждой пары строк начинается с «#», тогда как последующая строка каждой пары строк содержит буквенно-цифровую строку.

 $ cat file
#Foo
1234567
#Bar
1234
#Baz
123456789
  

Как мне автоматически добавить длину строки 2 (а также ключевое слово) в строку 1 каждой пары строк? Я считаю, что awk это правильный выбор для такой операции.

 $ awk 'desired code' file
#Foo_Length7
1234567
#Bar_Length4
1234
#Baz_Length9
123456789
  

Вот моя попытка, но я не могу понять, чем заменить length($0) на:

 awk '{if ($1~/^#/) print $0"_Length"length($0); else print $0}' file
  

Ответ №1:

 $ awk '!(NR%2){print prev "_Length" length($0) ORS $0} {prev=$0}' file
#Foo_Length7
1234567
#Bar_Length4
1234
#Baz_Length9
123456789
  

Вы можете заменить !(NR%2) на !/^#/ или аналогичный, если хотите.

Ответ №2:

С помощью GNU awk:

 awk '{first=$0; getline; print first "_length" length($0); print}' file
  

Вывод:

#Foo_length7
1234567
#Bar_length4
1234
#Baz_length9
123456789

От man awk :

getline : Установите $ 0 для следующей входной записи; установите NF, NR, FNR, RT.

Комментарии:

1. Для получения дополнительной информации о getline том, когда ее использовать и как ее безопасно использовать, см. awk.freeshell.org/AllAboutGetline .

Ответ №3:

Не могли бы вы, пожалуйста, попробовать следующее. Здесь используется комбинация tac awk . Написанное на мобильном устройстве, пока не удалось протестировать, должно сработать.

 tac Input_file | 
awk '
NR%2!=0{
  len=length($0)
  print
  next
}
{
  print $0"_Length"len
  len=""
}' | 
tac
  

Объяснение: Сначала используется tac для печати выходных данных в обратном порядке, что поможет нам легко справиться с манипулированием данными. Затем с помощью awk каждое нечетное число строк печатает его и принимает его длину в переменной len. Затем в каждой четной строке выводится текущая строка с длиной предыдущей строки. Как только awk завершит свою обработку, снова используйте tac, чтобы изменить Input_file, чтобы сделать его в реальном формате.