awk - awk 提取失败
问题描述
我有一个巨大的文件,其中包含来自不同分子的一些原子的 xyz 位置。整个文件包含约 10000 个配置。我创建了一个脚本,它迭代配置的总数并提取与特定原子种类相关的坐标,该坐标在固定位置系统地重复,以及与每个系统相关的每一帧。我的代码运行良好,除非原子位置与我必须处理的帧的最后一个位置重合,跳过抓取它并在相应的文件中打印。
每帧包含 384 个原子。在 xyz 格式中,我们必须在开头考虑两行额外的行,其中原子数(在本例中为 384,第 1 行)和空白/注释行(第 2 行)所在的位置。带有原子位置行列表的 awk 文件格式如下:
{n = NR%386}
n == 1 {print "24"; next}
n == 2 ||
n == 91 ||
...
n == 378 ||
n == 380 ||
n == 381 ||
n == 386
其中n=NR%386
是 awk 在每次迭代中必须考虑的行数,以便获得正确的帧数,在
n == 1 {print "24"; next}
代码打印出我想为每一帧提取的原子数,在本例中为 24。
问题出现在最后一个值上,即在前进到下一帧之前每帧的最后一个位置:
n == 386
使用命令时
awk -f file.awk filename.xyz >> test.txt
代码将跳过读取、提取和打印最后一个坐标。
我必须处理的 filename.xyz 类似于:
384
i = 3171, time = 3171.000, E = -3298.3005315786
C 6.66359796 19.29831718 16.63773520
C 6.19922671 19.83243350 15.35406226
C 7.73577004 21.24303011 16.94974860
C 7.32315891 21.77975003 15.67093925
N 5.08248005 17.55384984 15.51887635
N 7.75857672 23.00895664 15.43811018
N 8.58649028 22.07495287 17.61330368
N 7.45555304 19.97249138 17.42360101
...
...
...
N 3.62924684 23.22942656 15.38486984
N 4.52670891 22.25077226 17.55981432
N 3.17369677 20.23465407 17.45881199
N 2.28230853 21.30557433 14.86646780
S 1.48394488 18.18032187 17.21253664
S 0.70072709 19.13053602 14.60582837
S 4.67511560 23.53830074 16.57005901
目前,只是试图仅提取位置 386
n == 386
产生类似的东西:
1
i = 3171, time = 3171.000, E = -3298.3005315786
1
i = 3172, time = 3172.000, E = -3298.3023115390
1
i = 3173, time = 3173.000, E = -3298.3056102462
1
i = 3174, time = 3174.000, E = -3298.3101590395
这只是与注释行相对应,显然跳过或未正确解释要 grep 的行。
我想了解为什么 awk 如果无法正确提取最后一行以及如何解决问题。
解决方案
这似乎是一道数学题。NR%386
由于模运算符的工作方式,永远不会是 386(当您将 386 除以 386 时没有余数)。所以你n==386
永远不会被执行。尝试使用(NR-1)%386
代替NR%386
并相应地移动所有条件:
n == 0 {print "24"; next}
等等。如果你需要n
计算,加一个。
推荐阅读
- javascript - 在 chartjs 中包含 chartjszoom 后将无法缩放
- jquery - 如何使用ajax在url中传递不同的链接值
- java - 为什么即使我不提交也会收到 SQLException?
- c# - 释放锁并取消一个死锁的 TPL 任务
- typegraphql - 如何将参数传递给基于类的中间件
- javascript - 当用户在 textarea 中输入时,如何为文本后面的行提供单独的颜色?
- python-3.x - DOcplexException:表达式 xx 不能用作 xxx 的分隔符
- python - 机器学习多类分类结果好得令人难以置信?
- reactjs - Navbar.Brand 无法访问
- python - 无法访问 S3 存储桶的子文件夹 – Python、Boto3