понимание SUB, используемого в команде AWK


Мне нужно понять, как работает эта команда:

awk 'BEGIN{while(a++<30)s=s " "};{sub(/^.{6}/,"&" s)};l' myfile
Я понимаю, как первая часть (выражение В разделе BEGIN {}) создает строку пробелов длиной 30 символов. Но не понимаю вторую часть (sub).

sub добавляет недавно сгенерированную строку "s" в 6-й столбец "myfile". Но, как я вижу команду, шаблон поиска /^.{6}/ должен искать все строки, которые начинаются с одного символа (.) а затем {6} и заменить их пробелом-добавлено струна!

Не могли бы вы помочь мне лучше понять это?
2 3

2 ответа:

Это не имеет никакого отношения к 6-му столбцу, и он не ищет литерал {6}.

Фигурные скобки означают "это много из предыдущего шаблона" (если вы вызываете GNU awk с --posix или --re-interval).

Итак, этот паттерн:

/^.{6}/

Эквивалентно этому:

/^....../

Он добавляет строку s после первых 6 символов, которые могут быть любыми символами.

Следующая команда awk сделает нечто подобное:

awk 'BEGIN{while(a++<30)s=s " "} {print substr($0, 1, 6) s substr($0, 7)}' myfile

Смотрите ответ @BillKarwin для того, что он делает, и смотрите 2-й сценарий awk ниже для более сжатого способа сделать это:

$ cat file
abcdefghi

$ awk 'BEGIN{while(a++<30)s=s " "} {sub(/^.{6}/,"&" s)} 1' file
abcdef                              ghi

$ awk '{printf "%-36s%s\n",substr($0,1,6),substr($0,7)}' file
abcdef                              ghi