Команда Awk для замены подстроки определенным значением

используя этот пост в качестве ссылки

awk '{a[FNR] = a[FNR]" " $2}END{for(i=1;i<=FNR;i++) print a[i]}' input{1..n}

массив содержит каждую строку из разных файлов

FNR количество записей, прочитанных в текущем входном файле, обнуляется в начале каждого файла.

END{for(i=1;i

печатает содержимое массива a в конце файла

-1
22.10.2021, 15:25
2 ответа

вам нужно напечатать две подстроки, одну часть до этой позиции и другую часть после этой позиции, что-то вроде:

$ awk -v dummy='0123456789' -v start=314 -v len=10 '
{ print substr($0, 1, start-1) dummy substr($0, start+len) }' infile >outfile

тестирование:

$ awk -v dummy='0123456789' -v start=4 -v len=10 '
{ print substr($0, 1, start-1) dummy substr($0, start+len) }' <<<'0009876543210999'
0000123456789999

Проблема с вашей командой:

  1. вы используете $varвместо varв третьем аргументе gsub (), так как это приводит к тому, что gsub ()ищет поле, номер которого является значением var, которое представляет собой 10 цифр номер поля длины, поэтому awk пытается использовать gsub ()для этого поля #xxxxxxxxxx, но это не удается из-за выделения памяти для переоценки этого очень огромного количества полей (, потому что при использовании любого поля, отличного от $0в третьем аргумент для gsub (), он заставляет awk перестроить поля обратно в OFS по умолчанию ).

  2. если мы исправим проблему #1, то вы замените каждую цифру в переменной varстрокой 1234567890.

  3. вы затем использовали printон напечатает текущую строку без изменений, так как вы не делаете никаких обновлений для нее.

5
22.10.2021, 15:55

Вы можете использовать sedвместо awk, что будет менее подробным:

$ sed -E 's/^(.{313})[0-9]{10}/\10123456789/' infile
<313 chars>1234567890
1
22.10.2021, 16:05

Теги

Похожие вопросы