используя этот пост в качестве ссылки
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 в конце файла
вам нужно напечатать две подстроки, одну часть до этой позиции и другую часть после этой позиции, что-то вроде:
$ 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
Проблема с вашей командой:
вы используете $var
вместо var
в третьем аргументе gsub (), так как это приводит к тому, что gsub ()ищет поле, номер которого является значением var
, которое представляет собой 10 цифр номер поля длины, поэтому awk пытается использовать gsub ()для этого поля #xxxxxxxxxx, но это не удается из-за выделения памяти для переоценки этого очень огромного количества полей (, потому что при использовании любого поля, отличного от $0
в третьем аргумент для gsub (), он заставляет awk перестроить поля обратно в OFS по умолчанию ).
если мы исправим проблему #1, то вы замените каждую цифру в переменной var
строкой 1234567890
.
вы затем использовали print
он напечатает текущую строку без изменений, так как вы не делаете никаких обновлений для нее.
Вы можете использовать sed
вместо awk
, что будет менее подробным:
$ sed -E 's/^(.{313})[0-9]{10}/\10123456789/' infile
<313 chars>1234567890