根据先前查询和变量的结果从数组中提取一组数字

问题描述 投票:0回答:1

我试图让这个脚本在输出中搜索两组相关的信息。第一个是称为 HOMO 的项目,其中它是列表中的最大数字。那部分我已经放下了。现在,这个数字包含在以一组特定的 KPOINTS 为特征的许多迭代中的一个中(为此,我们可以将它们视为坐标。

输入文件的格式如下: ”“”

       20   20   20    1
  0.3771797E+02  0.8111539E-09  0.8111539E-09  0.1146494E-08  0.2500000E-15
   1.0000000000000000E-004
  CAR
 unknown system
    184     30    112

  0.1262379E-14  0.1262379E-14  0.1262379E-14  0.6944444E-02
      1        -52.737972   1.000000
      2        -52.737887   1.000000
      3        -52.737557   1.000000
      4        -52.737557   1.000000
      5        -52.737551   1.000000
      6        -52.737551   1.000000
      7        -22.134925   1.000000
      8        -22.134912   1.000000
      9        -22.134705   1.000000
     10        -22.134701   1.000000

0.1666667E+00  0.1262379E-14  0.1262379E-14  0.2777778E-01
      1        -52.737899   1.000000
      2        -52.737850   1.000000
      3        -52.737597   1.000000
      4        -52.737566   1.000000
      5        -52.737561   1.000000
      6        -52.737538   1.000000
      7        -22.134924   1.000000
      8        -22.134908   1.000000
      9        -22.134707   1.000000
     10        -22.134705   1.000000

“”” 前 6 行是文件标题: 然后是一个空格。 那么列表顶部的一组数字代表一个坐标。 然后是“带”的编号列表,后面是第二列中的能量值,第三列中是代表“填充或未填充”的数字

这是$infi代表的文件

对于$infi2,文件格式是这样的:

    Automatically generated mesh
      30
Reciprocal lattice
    0.00000000000000    0.00000000000000    0.00000000000000             1
    0.16666666666667    0.00000000000000    0.00000000000000             4
    0.33333333333334    0.00000000000000    0.00000000000000             4
    0.50000000000000    0.00000000000000    0.00000000000000             2
    0.16666666666667    0.16666666666667    0.00000000000000             4
    0.33333333333334    0.16666666666667    0.00000000000000             8
    0.50000000000000    0.16666666666667    0.00000000000000             4
    0.33333333333334    0.33333333333334    0.00000000000000             4
    0.50000000000000    0.33333333333334    0.00000000000000             4
    0.50000000000000    0.50000000000000    0.00000000000000             1

前 3 行是标题, 然后是前 3 列中的坐标表。第四列是我不感兴趣的数据。 30 代表坐标的数量,它们的排列顺序与 $infi 文件中的坐标相同。

结果应该是这样的 这里的项目:“1”代表编号列表中包含最高值的项目。因此,“0.882973”代表该点的能量(以 eV 为单位)。

然后脚本开始搜索另一个列出了坐标的文件,所以我编写了一个部分来搜索该文件并仅获取坐标并将它们放入一个数组中。我想要完成的就是这个。我想获取“1”并使用它来访问该数组并从第一组坐标中获取 XYZ。如果第一个数字的输出最终为“32”,我需要它来获取第 32 组 XYZ 坐标。我需要它看起来像这样:

1 0.882973
0.0000000000000000 0.0000000000000000 0.00000000000000

但是,我很难让它从我的数组中获取一组三个坐标,如下所示:


    0.000000000000000.000000000000000.00000000000000 0.166666666666670.000000000000000.00000000000000 0.333333333333340.000000000000000.00000000000000 0.500000000000000.000000000000000.00000000000000 0.166666666666670.166666666666670.00000000000000 0.333333333333340.166666666666670.00000000000000 0.500000000000000.166666666666670.00000000000000 0.333333333333340.333333333333340.00000000000000 0.500000000000000.333333333333340.00000000000000 0.500000000000000.500000000000000.00000000000000 0.000000000000000.000000000000000.25000000000000 0.166666666666670.000000000000000.25000000000000 0.333333333333340.000000000000000.25000000000000 0.500000000000000.000000000000000.25000000000000 0.166666666666670.166666666666670.25000000000000 0.333333333333340.166666666666670.25000000000000 0.500000000000000.166666666666670.25000000000000 0.333333333333340.333333333333340.25000000000000 0.500000000000000.333333333333340.25000000000000 0.500000000000000.500000000000000.25000000000000 0.000000000000000.000000000000000.50000000000000 0.166666666666670.000000000000000.50000000000000 0.333333333333340.000000000000000.50000000000000 0.500000000000000.000000000000000.50000000000000 0.166666666666670.166666666666670.50000000000000 0.333333333333340.166666666666670.50000000000000 0.500000000000000.166666666666670.50000000000000 0.333333333333340.333333333333340.50000000000000 0.500000000000000.333333333333340.50000000000000 0.500000000000000.500000000000000.50000000000000

每三个数字就是一组这些坐标。然而他们却被砸在一起了?

创建数组然后搜索数组的脚本如下所示:

#Nab the kpoint associated with the homo of all homos then grap the associated kpoints
homokpoint=`tail -n +4 $infi2 | awk '{print $1 $2 $3}' |head -n "$kpointquantity"`

realhomokpoint=`cut -d'|' -f ($kpointnumber*3-2)-($kpointnumber*3) $homokpoint`

The results look like this:
1 0.882973
0.000000000000000.000000000000000.00000000000000 0.166666666666670.000000000000000.00000000000000 0.333333333333340.000000000000000.00000000000000 0.500000000000000.000000000000000.00000000000000 0.166666666666670.166666666666670.00000000000000 0.333333333333340.166666666666670.00000000000000 0.500000000000000.166666666666670.00000000000000 0.333333333333340.333333333333340.00000000000000 0.500000000000000.333333333333340.00000000000000 0.500000000000000.500000000000000.00000000000000 0.000000000000000.000000000000000.25000000000000 0.166666666666670.000000000000000.25000000000000 0.333333333333340.000000000000000.25000000000000 0.500000000000000.000000000000000.25000000000000 0.166666666666670.166666666666670.25000000000000 0.333333333333340.166666666666670.25000000000000 0.500000000000000.166666666666670.25000000000000 0.333333333333340.333333333333340.25000000000000 0.500000000000000.333333333333340.25000000000000 0.500000000000000.500000000000000.25000000000000 0.000000000000000.000000000000000.50000000000000 0.166666666666670.000000000000000.50000000000000 0.333333333333340.000000000000000.50000000000000 0.500000000000000.000000000000000.50000000000000 0.166666666666670.166666666666670.50000000000000 0.333333333333340.166666666666670.50000000000000 0.500000000000000.166666666666670.50000000000000 0.333333333333340.333333333333340.50000000000000 0.500000000000000.333333333333340.50000000000000 0.500000000000000.500000000000000.50000000000000

我尝试调整数组构建的周长,然后它正确地添加数据的空格,但随后它添加了我在输出文件的第四列中不查找的项目。

我正在尝试以“1”的方式进行搜索,然后它将抓取基于 x3-2 到 x3 的三个数字的集合,因此它会抓取中的第 1-3 个数字x=1 的情况。我的希望是,如果 x=2 等等,它会抓取第 4-6 项。算术似乎无法识别变量,我怎样才能更好地格式化它们?

编辑:添加问号。
编辑:添加输入文件格式

shell math search
1个回答
0
投票

bash 算术在

((
..
))
内完成,结果通过前缀
$
:

使用
$ a=1
$ b=2
$ (( c = a+b ))
$ echo $(( c * b ))
6
$

但是,如果您的数组是包含空格分隔坐标的单行,如您所示,您可以通过执行以下操作来提取第 n 个:

$ cat >coords <<EOD
0.000000000000000.000000000000000.00000000000000 0.166666666666670.000000000000000.00000000000000 0.333333333333340.000000000000000.00000000000000 0.500000000000000.000000000000000.00000000000000 0.166666666666670.166666666666670.00000000000000 0.333333333333340.166666666666670.00000000000000 0.500000000000000.166666666666670.00000000000000 0.333333333333340.333333333333340.00000000000000 0.500000000000000.333333333333340.00000000000000 0.500000000000000.500000000000000.00000000000000 0.000000000000000.000000000000000.25000000000000 0.166666666666670.000000000000000.25000000000000 0.333333333333340.000000000000000.25000000000000 0.500000000000000.000000000000000.25000000000000 0.166666666666670.166666666666670.25000000000000 0.333333333333340.166666666666670.25000000000000 0.500000000000000.166666666666670.25000000000000 0.333333333333340.333333333333340.25000000000000 0.500000000000000.333333333333340.25000000000000 0.500000000000000.500000000000000.25000000000000 0.000000000000000.000000000000000.50000000000000 0.166666666666670.000000000000000.50000000000000 0.333333333333340.000000000000000.50000000000000 0.500000000000000.000000000000000.50000000000000 0.166666666666670.166666666666670.50000000000000 0.333333333333340.166666666666670.50000000000000 0.500000000000000.166666666666670.50000000000000 0.333333333333340.333333333333340.50000000000000 0.500000000000000.333333333333340.50000000000000 0.500000000000000.500000000000000.50000000000000
EOD
$ awk '{print $n}' n=1 coords
0.000000000000000.000000000000000.00000000000000
$ awk '{print $n}' n=2 coords
0.166666666666670.000000000000000.00000000000000
$ awk '{print $n}' n=9 coords
0.500000000000000.333333333333340.00000000000000

您可以使用 sed 插入空格:

... | sed -nE 's/(.)(.\.)/\1 \2/gp'

所以:

$ awk '{print $n}' n=10 coords | sed -nE 's/(.)(.\.)/\1 \2/gp'
0.50000000000000 0.50000000000000 0.00000000000000
© www.soinside.com 2019 - 2024. All rights reserved.