我是 bash 脚本的初学者,但我尝试删除 pdb 文件 ( test.pdb
) 中该文件之前REMARK time 20.00
和之后的所有内容REMARK time 30.00
。我正在使用这个sed
命令,例如:
sed 's/^.*\(REMARK time 20.00.*REMARK time 30.00\).*$/\1/' test.pdb > end.pdb
不幸的是,上面的命令生成 end.pdb 文件,该文件完全是空的。你能帮我解决这个问题吗?
我的test.pdb
文件如下:
REMARK time 10.00 ENERGY 1.95686E+03
HELIX 1 H1 GLU 131 SER 146 1 15
HELIX 2 H2 GLU 278 SER 293 1 15
HELIX 3 H3 GLU 426 SER 441 1 15
HELIX 4 H4 GLU 574 SER 589 1 15
SHEET 1 B1 2 ALA 32 VAL 34 0
SHEET 2 B1 2 LYS 48 GLU 50 -1 N GLU 50 O ALA 32
SHEET 1 B2 2 ALA 32 LEU 35 0
SHEET 2 B2 2 TRP 123 ASP 126 -1 N ASP 126 O ALA 32
SHEET 1 B3 2 LEU 47 PRO 51 0
SHEET 2 B3 2 VAL 62 PHE 66 -1 N PHE 66 O LEU 47
SHEET 1 B4 2 ASN 58 ASN 68 0
SHEET 2 B4 2 ASP 71 LEU 81 -1 N LEU 81 O ASN 58
SHEET 1 B5 2 TRP 77 ASP 82 0
SHEET 2 B5 2 LYS 85 LEU 90 -1 N LEU 90 O TRP 77
SHEET 1 B6 2 ALA 84 LEU 90 0
SHEET 2 B6 2 LEU 93 VAL 99 -1 N VAL 99 O ALA 84
SHEET 1 B7 2 ASN 96 VAL 99 0
SHEET 2 B7 2 ASP 111 GLU 114 -1 N GLU 114 O ASN 96
SHEET 1 B8 2 HIS 107 VAL 113 0
SHEET 2 B8 2 ASP 119 LEU 125 -1 N LEU 125 O HIS 107
SHEET 1 B9 2 ALA 179 VAL 181 0
SHEET 2 B9 2 LYS 195 GLU 197 -1 N GLU 197 O ALA 179
SHEET 1 B* 2 ALA 179 LEU 182 0
........
ENDMDL
REMARK time 20.00 ENERGY 1.96641E+03
HELIX 1 H1 GLU 131 SER 146 1 15
HELIX 2 H2 GLU 278 SER 293 1 15
HELIX 3 H3 GLU 426 SER 441 1 15
HELIX 4 H4 GLU 574 SER 589 1 15
SHEET 1 B1 2 ALA 32 VAL 34 0
SHEET 2 B1 2 LYS 48 GLU 50 -1 N GLU 50 O ALA 32
SHEET 1 B2 2 ALA 32 LEU 35 0
SHEET 2 B2 2 TRP 123 ASP 126 -1 N ASP 126 O ALA 32
SHEET 1 B3 2 LEU 47 PRO 51 0
SHEET 2 B3 2 VAL 62 PHE 66 -1 N PHE 66 O LEU 47
SHEET 1 B4 2 ASN 58 ASN 68 0
SHEET 2 B4 2 ASP 71 LEU 81 -1 N LEU 81 O ASN 58
SHEET 1 B5 2 TRP 77 ASP 82 0
SHEET 2 B5 2 LYS 85 LEU 90 -1 N LEU 90 O TRP 77
SHEET 1 B6 2 ALA 84 LEU 90 0
SHEET 2 B6 2 LEU 93 VAL 99 -1 N VAL 99 O ALA 84
SHEET 1 B7 2 ASN 96 VAL 99 0
SHEET 2 B7 2 ASP 111 GLU 114 -1 N GLU 114 O ASN 96
SHEET 1 B8 2 HIS 107 VAL 113 0
SHEET 2 B8 2 ASP 119 LEU 125 -1 N LEU 125 O HIS 107
SHEET 1 B9 2 ALA 179 VAL 181 0
SHEET 2 B9 2 LYS 195 GLU 197 -1 N GLU 197 O ALA 179
SHEET 1 B* 2 ALA 179 LEU 182 0
SHEET 2 B* 2 TRP 270 ASP 273 -1 N ASP 273 O ALA 179
SHEET 1 B* 2 LEU 194 GLY 196 0
SHEET 2 B* 2 MET 211 PHE 213 -1 N PHE 213 O LEU 194
SHEET 1 B* 2 ASN 205 ASN 215 0
SHEET 2 B* 2 ASP 218 LEU 228 -1 N LEU 228 O ASN 205
SHEET 1 B* 2 TRP 224 ASP 229 0
....................
ENDMDL
REMARK time 100.00 ENERGY 1.95395E+03
HELIX 1 H1 GLU 131 SER 146 1 15
HELIX 2 H2 GLU 278 SER 293 1 15
HELIX 3 H3 GLU 426 SER 441 1 15
HELIX 4 H4 GLU 574 SER 589 1 15
SHEET 1 B1 2 ALA 32 VAL 34 0
SHEET 2 B1 2 LYS 48 GLU 50 -1 N GLU 50 O ALA 32
SHEET 1 B2 2 ALA 32 LEU 35 0
SHEET 2 B2 2 TRP 123 ASP 126 -1 N ASP 126 O ALA 32
SHEET 1 B3 2 LEU 47 PRO 51 0
SHEET 2 B3 2 VAL 62 PHE 66 -1 N PHE 66 O LEU 47
SHEET 1 B4 2 ASN 58 ASN 68 0
SHEET 2 B4 2 ASP 71 LEU 81 -1 N LEU 81 O ASN 58
SHEET 1 B5 2 TRP 77 ASP 82 0
SHEET 2 B5 2 LYS 85 LEU 90 -1 N LEU 90 O TRP 77
SHEET 1 B6 2 ALA 84 LEU 90 0
.......
CONECT 1131 1133 1132
CONECT 1133 1135 1134
CONECT 1135 1137 1136
CONECT 1137 1139 1138
CONECT 1139 1141 1140
CONECT 1141 1143 1142
CONECT 1143 1145 1144
CONECT 1145 1146
ENDMDL
最后我只想提取REMARK time 20.00
以下信息:
REMARK time 20.00 ENERGY 1.96641E+03
HELIX 1 H1 GLU 131 SER 146 1 15
HELIX 2 H2 GLU 278 SER 293 1 15
HELIX 3 H3 GLU 426 SER 441 1 15
HELIX 4 H4 GLU 574 SER 589 1 15
SHEET 1 B1 2 ALA 32 VAL 34 0
SHEET 2 B1 2 LYS 48 GLU 50 -1 N GLU 50 O ALA 32
SHEET 1 B2 2 ALA 32 LEU 35 0
SHEET 2 B2 2 TRP 123 ASP 126 -1 N ASP 126 O ALA 32
SHEET 1 B3 2 LEU 47 PRO 51 0
SHEET 2 B3 2 VAL 62 PHE 66 -1 N PHE 66 O LEU 47
SHEET 1 B4 2 ASN 58 ASN 68 0
SHEET 2 B4 2 ASP 71 LEU 81 -1 N LEU 81 O ASN 58
SHEET 1 B5 2 TRP 77 ASP 82 0
SHEET 2 B5 2 LYS 85 LEU 90 -1 N LEU 90 O TRP 77
SHEET 1 B6 2 ALA 84 LEU 90 0
SHEET 2 B6 2 LEU 93 VAL 99 -1 N VAL 99 O ALA 84
SHEET 1 B7 2 ASN 96 VAL 99 0
SHEET 2 B7 2 ASP 111 GLU 114 -1 N GLU 114 O ASN 96
SHEET 1 B8 2 HIS 107 VAL 113 0
SHEET 2 B8 2 ASP 119 LEU 125 -1 N LEU 125 O HIS 107
SHEET 1 B9 2 ALA 179 VAL 181 0
SHEET 2 B9 2 LYS 195 GLU 197 -1 N GLU 197 O ALA 179
SHEET 1 B* 2 ALA 179 LEU 182 0
SHEET 2 B* 2 TRP 270 ASP 273 -1 N ASP 273 O ALA 179
SHEET 1 B* 2 LEU 194 GLY 196 0
SHEET 2 B* 2 MET 211 PHE 213 -1 N PHE 213 O LEU 194
SHEET 1 B* 2 ASN 205 ASN 215 0
SHEET 2 B* 2 ASP 218 LEU 228 -1 N LEU 228 O ASN 205
SHEET 1 B* 2 TRP 224 ASP 229 0
SHEET 2 B* 2 LYS 232 LEU 237 -1 N LEU 237 O TRP 224
......
CONECT 1141 1143 1142
CONECT 1143 1145 1144
CONECT 1145 1146
ENDMDL
答案1
您使用的命令用于在行内进行编辑。要提取一系列行,您可以使用范围寻址/start_pattern/,/end pattern/
:
sed -n '/REMARK time *20\.00/,/ENDMDL/p' test.pdb
因此,您使用 option 抑制默认输出-n
,然后p
打印从REMARK time *20.00
下一个到下一个的所有内容ENDMDL
(这似乎是您想要的,而不是包括下一个REMARK time
- 地址范围不是贪婪的,所以您可以这样做)。
如果您的REMARK
行使用制表符而不是空格,则可以使用/REMARK time[[:space:]]*20\.00/
.最后,您需要对.
with进行转义\.
,否则.
会匹配任何字符。
答案2
Philippos 已经给你了很好的 sed 答案,但这里有一种不同的方法。您可以使用awk
和设置输入和输出记录分隔符变量(分别为RS
和ORS
;这通常是一个\n
字符,它定义“行”,以及附加到每个print
调用的内容)到ENDMDL
。这样,每行之间的整个行块ENDMDL
将被视为单个“行”,因此您可以告诉awk
打印包含您正在查找的模式的任何行:
awk 'BEGIN{ RS=ORS="ENDMDL\n"}/REMARK\s*time\s*20\.00/' foo.pdb
在您的文件上运行它会给出:
$ awk 'BEGIN{ RS=ORS="ENDMDL\n"}/REMARK\s*time\s*20\.00/' foo.pdb
REMARK time 20.00 ENERGY 1.96641E+03
HELIX 1 H1 GLU 131 SER 146 1 15
HELIX 2 H2 GLU 278 SER 293 1 15
HELIX 3 H3 GLU 426 SER 441 1 15
HELIX 4 H4 GLU 574 SER 589 1 15
SHEET 1 B1 2 ALA 32 VAL 34 0
SHEET 2 B1 2 LYS 48 GLU 50 -1 N GLU 50 O ALA 32
SHEET 1 B2 2 ALA 32 LEU 35 0
SHEET 2 B2 2 TRP 123 ASP 126 -1 N ASP 126 O ALA 32
SHEET 1 B3 2 LEU 47 PRO 51 0
SHEET 2 B3 2 VAL 62 PHE 66 -1 N PHE 66 O LEU 47
SHEET 1 B4 2 ASN 58 ASN 68 0
SHEET 2 B4 2 ASP 71 LEU 81 -1 N LEU 81 O ASN 58
SHEET 1 B5 2 TRP 77 ASP 82 0
SHEET 2 B5 2 LYS 85 LEU 90 -1 N LEU 90 O TRP 77
SHEET 1 B6 2 ALA 84 LEU 90 0
SHEET 2 B6 2 LEU 93 VAL 99 -1 N VAL 99 O ALA 84
SHEET 1 B7 2 ASN 96 VAL 99 0
SHEET 2 B7 2 ASP 111 GLU 114 -1 N GLU 114 O ASN 96
SHEET 1 B8 2 HIS 107 VAL 113 0
SHEET 2 B8 2 ASP 119 LEU 125 -1 N LEU 125 O HIS 107
SHEET 1 B9 2 ALA 179 VAL 181 0
SHEET 2 B9 2 LYS 195 GLU 197 -1 N GLU 197 O ALA 179
SHEET 1 B* 2 ALA 179 LEU 182 0
SHEET 2 B* 2 TRP 270 ASP 273 -1 N ASP 273 O ALA 179
SHEET 1 B* 2 LEU 194 GLY 196 0
SHEET 2 B* 2 MET 211 PHE 213 -1 N PHE 213 O LEU 194
SHEET 1 B* 2 ASN 205 ASN 215 0
SHEET 2 B* 2 ASP 218 LEU 228 -1 N LEU 228 O ASN 205
SHEET 1 B* 2 TRP 224 ASP 229 0
....................
ENDMDL
请注意,某些 awk 版本可能不喜欢\s
,因此您可以尝试这样做:
awk 'BEGIN{ RS=ORS="ENDMDL\n"} $1=="REMARK" && $2=="time" && $3=="20.00"' foo.pdb