Если вы знаете, что все строки заканчиваются на «000» (и без пробелов!), Вы хотите нумеровать строки последовательно, начиная с «001», и у вас не будет более 999 строк:
$ cat myfile
XXXXXXX 290D 00 000000000
XXXXXXX 290D 00 000000000
XXXXXXX 290D 00 000000000
$ awk '{printf "%s%03d\n", substr($0,1,length($0)-3), NR}' myfile
XXXXXXX 290D 00 000000001
XXXXXXX 290D 00 000000002
XXXXXXX 290D 00 000000003
substr($0,1,length($0)-3)
=> убрать последние 3 символа printf "%s%03d\n"
- первая позиция (% s), заполненная результатами вызова substr()
;вторая позиция (% 03d) - заполнение нулями номера строки записи (NR);не забывайте возврат каретки / перевод строки (\ n) - , если у вас более 999 строк, тогда
%03d
фактически выдаст 4/5/6-значный вывод (при условии 4/5/6-значное)номера строк)
Если в некоторых строках могут быть ненулевые значения в последних 3 позициях, и вы не хотите перезаписывать указанные цифры, но вы хотите продолжить перенумерацию 000 (последовательно, начиная с'001'):
$ cat myfile
XXXXXXX 290D 00 000000000
XXXXXXX 290D 00 000000456 <=== leave this one as is
XXXXXXX 290D 00 000000000
# adding some white space for readability ...
$ awk '
BEGIN { mycount=1 }
/000$/ { printf "%s%03d\n", substr($0,1,length($0)-3), mycount; mycount++ ; next }
{ print }
' myfile
XXXXXXX 290D 00 000000001
XXXXXXX 290D 00 000000456
XXXXXXX 290D 00 000000002
mycount=1
- инициализировать наш счетчик конца строки /000$/
- если строка заканчивается на «000», выдают то же самоеprintf, как в предыдущем примере, заменив номер текущей строки (NR) нашим счетчиком (mycount) mycount++ ; next
- увеличьте наш счетчик, перейдите к следующей строке в файле { print }
- если шаблон (/ 000 $ /) не совпадает, выведите всю строку