간단히:

간단히:

텍스트 파일이 있고 23번째 문자에 대한 모든 값이 있지만 처음부터 시작하여 최종 값에 도달할 때까지 각 줄을 증가시키려면 0해당 값이 필요합니다 .X15864

이 코드를 사용해 보았지만 sed구체적이지 않고 0모든 값을 64값으로 변경합니다.

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

내가 가진 것은 다음과 같습니다.

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

그리고 내가 원하는 것은;

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

나는 sed아직 그것을 사용하는 데 익숙하지 않습니다. 단지 내 bash 지식의 한계일 뿐입니다. 더 좋을 수도 있을 것 같은데 awk, 그것에 대해서는 아는 바가 없습니다.

답변1

만약 너라면진짜필드에서 특정 문자 위치를 수정해야 하는 경우 awk빈 필드 필드 구분 기호를 설정할 수 있습니다.

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

OTOH 정말로 다섯 번째 공백을 분리하여 수정하고 싶다면대지그런 다음 기본 구분 기호를 사용할 수 있습니다

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

답변2

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

간단히:

\K23번째 문자가 확실히 0귀하의 사양과 일치 하므로 처음 22자를 건너뛰고 일치하지 않도록 하세요 . 줄 번호는 $. % 58카운터를 일정하게 유지해야 하는지 아니면 증가시켜야 하는지 알려줍니다.

답변3

열 23(또는 주어진 예에서는 열 5)에서 0만 바꾸려면 다음과 같습니다.

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

하지만 이 문장은 단지 여러분의 sed 지식을 향상시키기 위한 것입니다. 증분 변수로 바꾸는 것은 일반적인 sed 작업이 아닙니다. 이는 가능하지만 실용적이지 않습니다. sed를 쉘 스크립트와 혼합할 수 있지만 Python이나 Perl과 같이 원하는 스크립트 언어를 사용하는 것이 더 나을 수도 있습니다.

관련 정보