首页 > 解决方案 > 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 如果无法正确提取最后一行以及如何解决问题。

标签: awk

解决方案


这似乎是一道数学题。NR%386由于模运算符的工作方式,永远不会是 386(当您将 386 除以 386 时没有余数)。所以你n==386永远不会被执行。尝试使用(NR-1)%386代替NR%386并相应地移动所有条件:

n == 0 {print "24"; next}

等等。如果你需要n计算,加一个。


推荐阅读