#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, чтобы сделать его в реальном формате.