아래와 같이 *.pdb 파일이 있습니다.
CRYST1 78.428 78.428 78.428 90.00 90.00 90.00 P 1 1
ATOM 1 CI1 JPIPP 1 41.874 78.965 24.633 1.00 0.00 PI C
ATOM 2 CI2 JPIPP 1 41.978 79.560 26.065 1.00 0.00 PI C
ATOM 3 CI3 JPIPP 1 40.811 80.549 26.148 1.00 0.00 PI C
ATOM 4 CI4 JPIPP 1 39.498 79.850 25.983 1.00 0.00 PI C
ATOM 5 O4P JPIPP 1 38.376 80.788 26.069 1.00 0.00 PI O
ATOM 6 P4 JPIPP 1 37.130 80.601 27.002 1.00 0.00 PI P
ATOM 7 O41 JPIPP 1 37.214 81.710 27.969 1.00 0.00 PI O
ATOM 8 O42 JPIPP 1 35.998 80.809 26.128 1.00 0.00 PI O
ATOM 9 O43 JPIPP 1 37.088 79.268 27.654 1.00 0.00 PI O
ATOM 37 HT3 ILE P 10 13.930 68.062 46.163 1.00 0.00 P1
ATOM 38 CA ILE P 10 15.421 69.513 46.954 1.00 0.00 P1 C
ATOM 39 HA ILE P 10 14.944 69.690 47.906 1.00 0.00 P1 H
ATOM 40 CB ILE P 10 16.432 68.520 47.458 1.00 0.00 P1 C
열 3이 P4 또는 CA인 경우 열 10의 값을 "1"로 변경하려고 합니다. 이를 달성하기 위해 awk를 사용해 보았지만 실패했습니다. awk에서는 형식을 보존할 수 없습니다.
"gawk" 사용을 제안하고 형식을 성공적으로 유지하는 답변을 찾았습니다. 솔루션을 변경해 보았지만 불행히도 작동하지 않습니다. 이 문제를 해결하는 데 도움을 주세요.
gawk '
# NR==FNR { pdb[NR]=$0; next }
{
split(pdb[FNR],flds,FS,seps)
if ( flds[3] == "CA" || flds[3] == "P4"
flds[10]=1
for (i=1;i in flds;i++)
printf "%s%s", flds[i], seps[i]
print ""
}
' NVT20ns.pdb > test.pdb
답변1
$ perl -pe 's/ILE P/ILEP/; s/^(\s*(\S+\s+){9})\S+/${1}1/ if /^(\s*(\S+\s+){2})(P4|CA)/; s/ILEP/ILE P/' ip.txt
CRYST1 78.428 78.428 78.428 90.00 90.00 90.00 P 1 1
ATOM 1 CI1 JPIPP 1 41.874 78.965 24.633 1.00 0.00 PI C
ATOM 2 CI2 JPIPP 1 41.978 79.560 26.065 1.00 0.00 PI C
ATOM 3 CI3 JPIPP 1 40.811 80.549 26.148 1.00 0.00 PI C
ATOM 4 CI4 JPIPP 1 39.498 79.850 25.983 1.00 0.00 PI C
ATOM 5 O4P JPIPP 1 38.376 80.788 26.069 1.00 0.00 PI O
ATOM 6 P4 JPIPP 1 37.130 80.601 27.002 1.00 1 PI P
ATOM 7 O41 JPIPP 1 37.214 81.710 27.969 1.00 0.00 PI O
ATOM 8 O42 JPIPP 1 35.998 80.809 26.128 1.00 0.00 PI O
ATOM 9 O43 JPIPP 1 37.088 79.268 27.654 1.00 0.00 PI O
ATOM 37 HT3 ILE P 10 13.930 68.062 46.163 1.00 0.00 P1
ATOM 38 CA ILE P 10 15.421 69.513 46.954 1.00 1 P1 C
ATOM 39 HA ILE P 10 14.944 69.690 47.906 1.00 0.00 P1 H
ATOM 40 CB ILE P 10 16.432 68.520 47.458 1.00 0.00 P1 C
ILE P
네 번째 열에는 처리할 전처리 및 후처리가 있습니다.s/^(\s*(\S+\s+){9})\S+/${1}1/
열 10 값을 다음으로 변경하십시오.1
/^(\s*(\S+\s+){2})(P4|CA)/
세 번째 열의P4
또는 와 일치합니다.CA