- 论坛徽章:
- 0
|
本帖最后由 stractor 于 2014-12-14 20:40 编辑
我才学awk。我有一个2160000行的数据文件,该文件记录原子坐标的x,y,z分量,原子数为108个,每一时刻保存了一组坐标,共20000个时刻点,那么这个文件的行数是108*20000=2160000。
文件的1-108行为第1步(第1个时刻)108个原子的坐标,每个原子坐标为1行,109-216为第2步所有原子的坐标,依次类推。
我想每隔10步提取一次坐标,即提取第1步,第11步,第21步,......。也就是提取第1-108行(第1步),第1081-1188行(第11步),第2161-2268行(第21步),.......。
写了一个awk程序如下:
{
for (i=1;i<=108;i++) {
for (k=i;k<=2160000;k=k+1080) {
if (NR==k) {
print i, k, NR, $0
}
}
}
}
我很难理解脚本运行后的输出结果(后三列是原子坐标):
1 1 1 2.15279 2.15279 2.15279
2 2 2 2.15279 0.00000 0.00000
3 3 3 0.00000 2.15279 0.00000
4 4 4 0.00000 0.00000 2.15279
************** 中间省略100行
105 105 105 10.76393 10.76393 10.76393
106 106 106 10.76393 8.61114 8.61114
107 107 107 8.61114 10.76393 8.61114
108 108 108 8.61114 8.61114 10.76393
以上应该是第1个时刻108个原子的原子坐标。
接着输出
1 1081 1081 2.17063 2.22018 2.08864
2 1082 1082 2.26649 12.85895 12.90851
3 1083 1083 12.82804 2.27516 0.04992
4 1084 1084 12.91431 0.06733 2.18726
************** 中间省略100行
105 1185 1185 10.75824 10.77543 10.82052
106 1186 1186 10.75691 8.71706 8.60478
107 1187 1187 8.65212 10.66284 8.56873
108 1188 1188 8.63280 8.67194 10.90492
以上应该是第11个时刻点108个原子的坐标。
接着输出第21个时刻点原子的坐标
1 2161 2161 2.18957 2.28558 2.02208
2 2162 2162 2.37194 12.81356 12.90239
3 2163 2163 12.74656 2.39551 0.09872
4 2164 2164 12.91271 0.13585 2.21755
******************
我的理解是:i 是最外层循环,i从1开始,到108结束,应该输出一个i,再输出一些列的k(即内存循环和选择语句),也就是感觉会输出类似如下的结果:
1 1 1 X X X (X是原子的x, y, z坐标)
1 1081 1081 x x x
1 2161 2161 x x x
****** 以下省略
i 取1 输出k和NR后,i 开始 取2而输出
2 2 2 X X X
2 1082 1082 X X X
2 2162 2162 X X X
****** 以下省略
再输入i=3,直到 i=108。
我的脚本能完成我的要求吗?为何输出的结果是那样的?
求有经验的人帮助我一下。
|
|