awk
читает файлы построчно, поэтому никогда не будет проблем найти «все» индексы в многострочном файле. Ваша проблема в том, что вы пытаетесь использовать блок BEGIN
, который, как следует из его названия, запускается только в начале программы. Кроме того, функция index()
принимает два аргумента.
Для ваших примеров данных это должно работать:
awk '/AAAA/{print index($0,"AAAA")+l} NR>1{l+=length}' sample.file
Первый блок кода запускается только при совпадении AAAA
, второй выполняется для каждой строки после первой, увеличивая счетчик на длину строки.
Для случая, когда у вас есть несколько совпадений на строку, это должно работать:
awk -v pat=AAAA 'BEGIN{for(n=0;n<length(pat);n++) rep=rep"x"} NR>1{while(i=index($0,pat)){print i+l; sub(pat,rep);} l+=length}' sample.file
Шаблон передается как переменная; Когда программа запускается, текст замены генерируется на основе длины шаблона. Затем каждая строка после первой зацикливается, получая индекс шаблона и заменяя его, чтобы следующая итерация возвращала следующий экземпляр.
Стоит отметить, что оба эти метода будут соответствовать AAAAAA
.