Reemplazar datos en caracteres específicos, luego cambiar el valor después de x líneas

Tengo un file de text, todos los valores del 23 ° personaje son 0 pero necesito que sean de valor X que comienza en 1 e incrementa cada 58 líneas hasta que alcanza un valor final de 64 .

Intenté usar este código sed , pero no es específico y cambia todos los valores 0 a 64 valores.

 for i in $(seq 1 1 64); do sed -e "s/0/$i/g" file.txt > newfile.txt done 

Lo que tengo es;

 ATOM 1 C0 ODA 0 1.452 2.430 23.632 1.00 1.00 C ATOM 2 C1 ODA 0 1.839 1.672 22.372 1.00 1.00 C ... ATOM 3711 H56 ODA 0 30.750 32.945 0.998 1.00 1.00 H ATOM 3712 H57 ODA 0 31.934 32.195 0.165 1.00 1.00 H 

Y lo que quiero es;

 ATOM 1 C0 ODA 1 1.452 2.430 23.632 1.00 1.00 C ATOM 2 C1 ODA 1 1.839 1.672 22.372 1.00 1.00 C ... ATOM 3711 H56 ODA 64 30.750 32.945 0.998 1.00 1.00 H ATOM 3712 H57 ODA 64 31.934 32.195 0.165 1.00 1.00 H 

No estoy casado con el uso de sed , es casi el límite de mi conocimiento de bash. Creo que awk podría ser mejor, pero no sé nada al respecto.

 perl -lpe 's/^.{22}\K0/$. % 58 ? $a||0 : $a++/e' yourfile 

Breve:

Omita los primeros 22 caracteres y manténgalos a un lado para que no aparezcan en la coincidencia debido a que el \K y el 23 ° carácter seguro son 0 por su especificación. El número de línea $. % 58 $. % 58 nos dirá si necesitamos mantener el contador retenido o incrementado.

Si realmente necesita modificar una position de carácter específica en awk , puede configurar un separador de campo de campo vacío:

 awk 'BEGIN{FS=""; OFS=FS} {$23 = int(FNR / 58) + 1 ; print}' file 

OTOH si realmente quieres modificar el quinto campo separado por el espacio en blanco entonces puedes usar el separador por defecto

 awk '{$5 = int(FNR / 58) + 1 ; print}' file 

Para replace solo el 0 en la columna 23 (o en su ejemplo dado la 5ta columna) necesita algo como esto:

 sed -e "s/^\(\(\S\S*\s\s*\)\{4\}\)0 /\1$i/" file.txt > newfile.txt 

Pero esta observación es solo para mejorar tu sed de conocimiento. Reemplazar con el incremento de variables no es un trabajo sed típico. Es posible pero no práctico. Podría mezclar sed con un script de shell, pero tal vez sea mejor que use el lenguaje de script que prefiera, como python o perl.