【发布时间】:2019-12-31 10:37:55
【问题描述】:
我的文件包含大约 40000 帧的 28 个原子的笛卡尔坐标。我需要从每一帧中提取原子 21 到 27 的坐标。
我尝试使用带有 for 循环的 bash 脚本。
for i in {0..39999}
do
cat $1 | grep -A 27 "frame $i " | tail -n 6 | awk '{print $2, $3, $4}' >> new_coors.xyz
done
数据有以下形式:
28
-1373.82296 frame 0 xyz file generated by terachem
Re 1.6345663991 0.9571586961 0.3920887712
N 0.7107677071 -1.0248027788 0.5007181135
N -0.3626961076 1.1948218124 -0.4621264246
C -1.1299268126 0.0792071086 -0.5595954110
C -0.5157993503 -1.1509115191 -0.0469223696
C 1.3354467762 -2.1017253883 1.0125736017
C 0.7611763218 -3.3742177216 0.9821756556
C -1.1378354025 -2.4089069492 -0.1199253156
C -0.4944655989 -3.5108477831 0.4043826684
C -0.8597552614 2.3604180994 -0.9043060625
C -2.1340008843 2.4846545826 -1.4451933224
C -2.4023114639 0.1449111237 -1.0888703147
C -2.9292779079 1.3528434658 -1.5302429615
H 2.3226814021 -1.9233467458 1.4602019023
H 1.3128699342 -4.2076373780 1.3768411246
H -2.1105470176 -2.5059031902 -0.5582958817
H -0.9564415355 -4.4988963635 0.3544299401
H -0.1913951275 3.2219343258 -0.8231465989
H -2.4436044324 3.4620639189 -1.7693069306
H -3.0306593902 -0.7362803011 -1.1626515622
H -3.9523215784 1.4136948699 -1.9142814745
C 3.3621999538 0.4972227756 1.1031860016
O 4.3763020637 0.2022266109 1.5735343064
C 2.2906331057 2.7428149541 0.0483795630
O 2.6669163864 3.8206298898 -0.1683800650
C 1.0351398442 1.4995168190 2.1137684156
O 0.6510904387 1.8559680025 3.1601927094
Cl 2.2433490373 0.2064711824 -1.9226174036
它有效,但需要大量时间, 将来我将使用更大的文件。有更快的方法吗?
【问题讨论】:
-
文件样本将不胜感激...
-
文件中的帧号是否按顺序排列?
-
此外,其他命令以及
for循环也占用内存,如果您可以让我们知道确切的要求,那么我们可以在单个awk本身中执行此操作,正如 Jepessen 所提到的,请添加示例在您的帖子中,然后让我们知道。 -
@Adam Srut,请不要在您的帖子中以图片或附件的形式在您的帖子中发布示例,请这样做并让我们知道。
标签: bash performance for-loop large-data