Substitua dados em um caractere específico e, em seguida, altere o valor após x linhas

1

Eu tenho um arquivo de texto, todos os valores do 23º caractere são 0 , mas preciso que eles tenham valor X , que começa em 1 e incrementa cada 58 linhas até atingir um valor final de 64 .

Eu tentei usar esse código sed , mas ele não é específico e altera todos os valores 0 para valores 64 .

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

O que eu tenho é:

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

E o que eu quero é:

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

Eu não sou casado para usar sed é apenas sobre o limite do meu conhecimento bash. Eu acho que awk pode ser melhor, mas eu não sei nada sobre isso.

    
por onekanban 06.03.2017 / 11:06

3 respostas

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

Resumo:

Ignore os primeiros 22 caracteres e mantenha-os à parte da correspondência, pois o \K e o 23º caracter, com certeza, são 0 por sua especificação. O número da linha $. % 58 nos informará se precisamos manter o contador retido ou incrementado.

    
por 06.03.2017 / 11:46
1

Se você realmente precisar modificar uma posição de caractere específica em awk , poderá definir um separador de campo de campo vazio:

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

OTOH se você realmente quiser modificar o quinto campo espaço em branco então você pode simplesmente usar o separador padrão

awk '{$5 = int(FNR / 58) + 1 ; print}' file
    
por 06.03.2017 / 14:15
0

Para substituir apenas 0 na coluna 23 (ou no seu exemplo dado na quinta coluna) você precisa de algo assim:

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

Mas esta observação é apenas para melhorar o seu conhecimento sed. Substituir por incrementar variáveis não é um típico job sed. É possível, mas não é prático. Você poderia misturar sed com um script de shell, mas talvez seja melhor usar a linguagem de script de sua escolha, como python ou perl.

    
por 06.03.2017 / 11:48