bor.mol2와 bor.com이라는 두 개의 파일이 있습니다. bor.mol2에는 원자의 X, Y, Z 좌표가 있고 @<TRIPOS>ATOM
파일 @<TRIPOS>BOND
의 키워드 열 3, 4, 5는 원자의 좌표입니다. 예를 들어 H1의 좌표는 -0.1660 2.5890 -0.2030입니다.
다른 파일은 bor.com이고 열 2, 3, 4는 X, Y, Z 좌표( 0 1
와 사이 1 2 1.0
)입니다. bor.mol2 좌표를 bor.com 좌표로 바꾸고 아래와 같이 boron.mol2를 얻고 싶습니다.
awk나 grep을 사용하여 이 작업을 어떻게 수행할 수 있나요?
붕소 두더지 2
@<TRIPOS>MOLECULE
MOL
19 18 1 0 0
SMALL
resp
@<TRIPOS>ATOM
1 H1 -0.1660 2.5890 -0.2030 H 1 MOL 0.425234
2 O1 -0.6950 1.8160 -0.3360 O 1 MOL -0.740851
3 B1 -0.0040 0.6800 -0.0410 B 1 MOL 0.916675
4 O2 1.2760 0.7930 0.3900 O 1 MOL -0.584834
5 C1 2.0810 -0.3200 0.7070 C 1 MOL 0.351772
6 C2 2.8020 -0.8460 -0.5220 C 1 MOL -0.254733
7 H2 3.3950 -0.0620 -0.9800 H 1 MOL 0.065923
8 H3 2.0930 -1.2150 -1.2550 H 1 MOL 0.065923
9 H4 3.4660 -1.6630 -0.2510 H 1 MOL 0.065923
10 H5 1.4780 -1.0990 1.1550 H 1 MOL -0.005252
11 H6 2.7960 0.0200 1.4450 H 1 MOL -0.005252
12 O3 -0.5850 -0.5340 -0.1770 O 1 MOL -0.584834
13 C3 -1.9220 -0.7000 -0.5940 C 1 MOL 0.351772
14 C4 -2.8780 -0.6420 0.5840 C 1 MOL -0.254733
15 H7 -3.8950 -0.8350 0.2550 H 1 MOL 0.065923
16 H8 -2.8530 0.3360 1.0520 H 1 MOL 0.065923
17 H9 -2.6110 -1.3870 1.3260 H 1 MOL 0.065923
18 H10 -2.1780 0.0530 -1.3290 H 1 MOL -0.005252
19 H11 -1.9740 -1.6700 -1.0740 H 1 MOL -0.005252
@<TRIPOS>BOND
1 1 2 1
2 2 3 1
3 3 4 1
4 3 12 1
5 4 5 1
6 5 6 1
7 5 10 1
8 5 11 1
9 6 7 1
10 6 8 1
11 6 9 1
12 12 13 1
13 13 14 1
14 13 18 1
15 13 19 1
16 14 15 1
17 14 16 1
18 14 17 1
@<TRIPOS>SUBSTRUCTURE
1 MOL 1 TEMP 0 **** **** 0 ROOT
bor.com:
%nprocshared=4
%mem=1GB
# am1 geom=connectivity sp
MOL
0 1
H -0.16720146 2.58919775 -0.19942423
O -0.69500000 1.81600000 -0.33600000
B -0.00400000 0.68000000 -0.04100000
O -0.38867986 -0.48241992 -0.62214658
C 0.24973028 -1.71425091 -0.37253088
C -0.34829932 -2.40893346 0.83855738
H -1.41561875 -2.54983268 0.70799890
H -0.18501334 -1.82371627 1.73688335
H 0.11053291 -3.38414892 0.98087325
H 1.31216868 -1.56088464 -0.23520857
H 0.10760188 -2.31766293 -1.25975262
O 1.04303104 0.71384972 0.81482310
C 1.49768870 1.90335555 1.42093890
C 2.50478033 2.62078365 0.54000342
H 2.89233808 3.49938587 1.04758216
H 2.04460091 2.94105867 -0.38832398
H 3.33724896 1.96604913 0.30506364
H 0.65864568 2.55057309 1.64429105
H 1.95688815 1.61234302 2.35819638
1 2 1.0
2 3 1.0
3 4 1.0 12 1.0
4 5 1.0
5 6 1.0 10 1.0 11 1.0
6 7 1.0 8 1.0 9 1.0
7
8
9
10
11
12 13 1.0
13 14 1.0 18 1.0 19 1.0
14 15 1.0 16 1.0 17 1.0
15
16
17
18
19
결과는 다음과 같이 boron.mol2여야 합니다.
@<TRIPOS>MOLECULE
MOL
19 18 1 0 0
SMALL
resp
@<TRIPOS>ATOM
1 H1 -0.16720146 2.58919775 -0.19942423 H 1 MOL 0.425234
2 O1 -0.69500000 1.81600000 -0.33600000 O 1 MOL -0.740851
3 B1 -0.00400000 0.68000000 -0.04100000 B 1 MOL 0.916675
4 O2 -0.38867986 -0.48241992 -0.62214658 O 1 MOL -0.584834
5 C1 0.24973028 -1.71425091 -0.37253088 C 1 MOL 0.351772
6 C2 -0.34829932 -2.40893346 0.83855738 C 1 MOL -0.254733
7 H2 -1.41561875 -2.54983268 0.70799890 H 1 MOL 0.065923
8 H3 -0.18501334 -1.82371627 1.73688335 H 1 MOL 0.065923
9 H4 0.11053291 -3.38414892 0.98087325 H 1 MOL 0.065923
10 H5 1.31216868 -1.56088464 -0.23520857 H 1 MOL -0.005252
11 H6 0.10760188 -2.31766293 -1.25975262 H 1 MOL -0.005252
12 O3 1.04303104 0.71384972 0.81482310 O 1 MOL -0.584834
13 C3 1.49768870 1.90335555 1.42093890 C 1 MOL 0.351772
14 C4 2.50478033 2.62078365 0.54000342 C 1 MOL -0.254733
15 H7 2.89233808 3.49938587 1.04758216 H 1 MOL 0.065923
16 H8 2.04460091 2.94105867 -0.38832398 H 1 MOL 0.065923
17 H9 3.33724896 1.96604913 0.30506364 H 1 MOL 0.065923
18 H10 0.65864568 2.55057309 1.64429105 H 1 MOL -0.005252
19 H11 1.95688815 1.61234302 2.35819638 H 1 MOL -0.005252
@<TRIPOS>BOND
1 1 2 1
2 2 3 1
3 3 4 1
4 3 12 1
5 4 5 1
6 5 6 1
7 5 10 1
8 5 11 1
9 6 7 1
10 6 8 1
11 6 9 1
12 12 13 1
13 13 14 1
14 13 18 1
15 13 19 1
16 14 15 1
17 14 16 1
18 14 17 1
@<TRIPOS>SUBSTRUCTURE
1 MOL 1 TEMP 0 **** **** 0 ROOT
답변1
저는 awk를 잘 몰라서 sed를 사용합니다.
sed -rn '/^ [A-Z]/{H;x;s/^\n//;x};/^ *[0-9]+ +[A-Z]+[0-9]+/{G;s/^( *[^ ]+ +[^ ]+) +[^ ]+ +[^ ]+ +[^ ]+([^\n]+)\n *[^ ]+( *[^ ]+ +[^ ]+ +[^\n]+).*/\1\3\2/;x;s/^[^\n]+\n//;x};/MOLECULE/,$p' bor.com bor.mol2 > boron.mol2
산출:붕소 두더지 2
@<TRIPOS>MOLECULE
MOL
19 18 1 0 0
SMALL
resp
@<TRIPOS>ATOM
1 H1 -0.16720146 2.58919775 -0.19942423 H 1 MOL 0.425234
2 O1 -0.69500000 1.81600000 -0.33600000 O 1 MOL -0.740851
3 B1 -0.00400000 0.68000000 -0.04100000 B 1 MOL 0.916675
4 O2 -0.38867986 -0.48241992 -0.62214658 O 1 MOL -0.584834
5 C1 0.24973028 -1.71425091 -0.37253088 C 1 MOL 0.351772
6 C2 -0.34829932 -2.40893346 0.83855738 C 1 MOL -0.254733
7 H2 -1.41561875 -2.54983268 0.70799890 H 1 MOL 0.065923
8 H3 -0.18501334 -1.82371627 1.73688335 H 1 MOL 0.065923
9 H4 0.11053291 -3.38414892 0.98087325 H 1 MOL 0.065923
10 H5 1.31216868 -1.56088464 -0.23520857 H 1 MOL -0.005252
11 H6 0.10760188 -2.31766293 -1.25975262 H 1 MOL -0.005252
12 O3 1.04303104 0.71384972 0.81482310 O 1 MOL -0.584834
13 C3 1.49768870 1.90335555 1.42093890 C 1 MOL 0.351772
14 C4 2.50478033 2.62078365 0.54000342 C 1 MOL -0.254733
15 H7 2.89233808 3.49938587 1.04758216 H 1 MOL 0.065923
16 H8 2.04460091 2.94105867 -0.38832398 H 1 MOL 0.065923
17 H9 3.33724896 1.96604913 0.30506364 H 1 MOL 0.065923
18 H10 0.65864568 2.55057309 1.64429105 H 1 MOL -0.005252
19 H11 1.95688815 1.61234302 2.35819638 H 1 MOL -0.005252
@<TRIPOS>BOND
1 1 2 1
2 2 3 1
3 3 4 1
4 3 12 1
5 4 5 1
6 5 6 1
7 5 10 1
8 5 11 1
9 6 7 1
10 6 8 1
11 6 9 1
12 12 13 1
13 13 14 1
14 13 18 1
15 13 19 1
16 14 15 1
17 14 16 1
18 14 17 1
@<TRIPOS>SUBSTRUCTURE
1 MOL 1 TEMP 0 **** **** 0 ROOT
답변2
한 가지 방법은 다음과 같습니다.
$ awk '{
if(/@<TRIPOS>ATOM/){a=1; print; next}
if(/@<TRIPOS>BOND/){a=0}
if(NR==FNR){
val[FNR][2]=$2;
val[FNR][3]=$3;
val[FNR][4]=$4;
}
else{
if(a){
OFS="\t"
$3=val[a][2];
$4=val[a][3];
$5=val[a][4]
a++;
}
print $0
}
}' <(grep '^ [A-Z]' bor.com) bor.mol2
위의 결과는 다음과 같습니다.
@<TRIPOS>MOLECULE
MOL
19 18 1 0 0
SMALL
resp
@<TRIPOS>ATOM
1 H1 -0.16720146 2.58919775 -0.19942423 H 1 MOL 0.425234
2 O1 -0.69500000 1.81600000 -0.33600000 O 1 MOL -0.740851
3 B1 -0.00400000 0.68000000 -0.04100000 B 1 MOL 0.916675
4 O2 -0.38867986 -0.48241992 -0.62214658 O 1 MOL -0.584834
5 C1 0.24973028 -1.71425091 -0.37253088 C 1 MOL 0.351772
6 C2 -0.34829932 -2.40893346 0.83855738 C 1 MOL -0.254733
7 H2 -1.41561875 -2.54983268 0.70799890 H 1 MOL 0.065923
8 H3 -0.18501334 -1.82371627 1.73688335 H 1 MOL 0.065923
9 H4 0.11053291 -3.38414892 0.98087325 H 1 MOL 0.065923
10 H5 1.31216868 -1.56088464 -0.23520857 H 1 MOL -0.005252
11 H6 0.10760188 -2.31766293 -1.25975262 H 1 MOL -0.005252
12 O3 1.04303104 0.71384972 0.81482310 O 1 MOL -0.584834
13 C3 1.49768870 1.90335555 1.42093890 C 1 MOL 0.351772
14 C4 2.50478033 2.62078365 0.54000342 C 1 MOL -0.254733
15 H7 2.89233808 3.49938587 1.04758216 H 1 MOL 0.065923
16 H8 2.04460091 2.94105867 -0.38832398 H 1 MOL 0.065923
17 H9 3.33724896 1.96604913 0.30506364 H 1 MOL 0.065923
18 H10 0.65864568 2.55057309 1.64429105 H 1 MOL -0.005252
19 H11 1.95688815 1.61234302 2.35819638 H 1 MOL -0.005252
@<TRIPOS>BOND
1 1 2 1
2 2 3 1
3 3 4 1
4 3 12 1
5 4 5 1
6 5 6 1
7 5 10 1
8 5 11 1
9 6 7 1
10 6 8 1
11 6 9 1
12 12 13 1
13 13 14 1
14 13 18 1
15 13 19 1
16 14 15 1
17 14 16 1
18 14 17 1
@<TRIPOS>SUBSTRUCTURE
1 MOL 1 TEMP 0 **** **** 0 ROOT
이 명령은 공백으로 시작하고 뒤에 대문자가 grep '^ [A-Z]' bor.com
오는 줄만 인쇄합니다. bor.com
이것이 우리가 원하는 유일한 라인입니다 bor.com
. bash의 구성을 사용하여 grep
출력을 awk에 파일 핸들로 전달합니다 <()
. 그런 다음 val
스크립트가 읽고 있는 파일이 입력 파일의 첫 번째 파일이면 스크립트는 배열에 값을 저장합니다( NR==FNR)
두 번째이고 @<TRIPOS>ATOM
문자열과 @<TRIPOS>BOND
문자열 사이에 있으면 세 번째, 네 번째를 대체합니다). 다섯 번째 필드는 배열의 값과 연관되어 있습니다 val
.