텍스트 파일이 있고 23번째 문자에 대한 모든 값이 있지만 처음부터 시작하여 최종 값에 도달할 때까지 각 줄을 증가시키려면 0
해당 값이 필요합니다 .X
1
58
64
이 코드를 사용해 보았지만 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
간단히:
\K
23번째 문자가 확실히 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과 같이 원하는 스크립트 언어를 사용하는 것이 더 나을 수도 있습니다.