如何在 python 中将文本文件与 awk 对齐?

How to align text file with awk in python?

我有这个数组:

dihedrals=['na-2e-na-cd   4    1.200       180.000           2.000', 'Pd-2e-na-cd   4    1.200       180.000           2.000', 'Pd-2e-na-ca  4    1.200       180.000           2.000', 'Pd-4n-na-hn   4    4.800         0.000           2.000', 'na-4n-cc-cc   4    4.200       180.000           2.000', 'na-2e-na-ca   4    1.200       180.000           2.000', 'Pd-2e-na-ca   4    1.200       180.000           2.000', 'cc-4n-na-hn   4    4.800         0.000           2.000', 'Pd-4n-na-cd   4    4.800         0.000           2.000', 'Pd-2e-na-cc   4    1.200       180.000           2.000', 'X -4n-na-X   2    3.400       180.000           2.000', 'Pd-4n-cc-h4   4    4.200       180.000           2.000', 'Pd-4n-cc-cc   4    4.200       180.000           2.000', 'na-2e-na-cd  4    1.200       180.000           2.000', 'na-2e-na-cc  4    1.200       180.000           2.000', 'cc-4n-na-cd   4    4.800         0.000           2.000', 'na-2e-na-ca  4    1.200       180.000           2.000', 'Pd-2e-na-cc  4    1.200       180.000           2.000', 'na-2e-na-cc   4    1.200       180.000           2.000', 'Pd-2e-na-cd  4    1.200       180.000           2.000', 'na-4n-cc-h4   4    4.200       180.000           2.000']

我想把它写在这样的文件中:

na-2e-na-cd   4    1.200       180.000           2.000
Pd-2e-na-cd   4    1.200       180.000           2.000
Pd-4n-na-hn   4    4.800         0.000           2.000
na-4n-cc-cc   4    4.200       180.000           2.000
na-2e-na-ca   4    1.200       180.000           2.000
cc-4n-na-hn   4    4.800         0.000           2.000
Pd-4n-na-cd   4    4.800         0.000           2.000
Pd-2e-na-cc   4    1.200       180.000           2.000
X -4n-na-X    2    3.400       180.000           2.000
Pd-4n-cc-h4   4    4.200       180.000           2.000
Pd-4n-cc-cc   4    4.200       180.000           2.000
na-2e-na-cc   4    1.200       180.000           2.000
cc-4n-na-cd   4    4.800         0.000           2.000
na-4n-cc-h4   4    4.200       180.000           2.000

我试过了:

!awk '{print "   ""    ""       ""           "}' a.txt

但是 awk 在此行中看到了额外的字段:"X -4n-na-X " 因为 X 旁边有一个 space。我试图将字段分隔符更改为两个 spaces with-F="[[:space:]][[:space:]]+":

import os
    for x in range(len(dihedrals)):
        dihedrals[x]=os.popen('echo "{}" |awk -F="[[:space:]][[:space:]]+"  \'{{  printf "%0s %0s %0s %0s %0s",,,,,,}}\'  '.format(dihedrals[x])).read()
        print(dihedrals[x])

但没有任何改变。 我也试过 printf %s:

import os
for x in range(len(dihedrals)):
    dihedrals[x]=os.popen('echo "{}"|awk \'{{printf "%0s %3s %8s %13s %15s",,,,,}}\'  '.format(dihedrals[x])).read()

但是还是不行。我怎样才能像上面解释的那样将我的变量写入文件?

我也尝试了 python 格式化、正则表达式、exc...但我无法完成。

注意:我也尝试过 column -t a.txt 但我再次遇到 X+space 行 (X -4n-na-X) 的问题,结果如下:

na-2e-na-cd  4         1.200  180.000  2.000
Pd-2e-na-cd  4         1.200  180.000  2.000
Pd-2e-na-ca  4         1.200  180.000  2.000
Pd-4n-na-hn  4         4.800  0.000    2.000
na-4n-cc-cc  4         4.200  180.000  2.000
na-2e-na-ca  4         1.200  180.000  2.000
Pd-2e-na-ca  4         1.200  180.000  2.000
cc-4n-na-hn  4         4.800  0.000    2.000
Pd-4n-na-cd  4         4.800  0.000    2.000
Pd-2e-na-cc  4         1.200  180.000  2.000
X            -4n-na-X  2      3.400    180.000  2.000
Pd-4n-cc-h4  4         4.200  180.000  2.000
Pd-4n-cc-cc  4         4.200  180.000  2.000
na-2e-na-cd  4         1.200  180.000  2.000
na-2e-na-cc  4         1.200  180.000  2.000
cc-4n-na-cd  4         4.800  0.000    2.000
na-2e-na-ca  4         1.200  180.000  2.000
Pd-2e-na-cc  4         1.200  180.000  2.000
na-2e-na-cc  4         1.200  180.000  2.000
Pd-2e-na-cd  4         1.200  180.000  2.000

一定要用awk吗?似乎沿着这些方向的东西可以在普通 Python:

中实现相同的目标
with open('a.txt', 'w') as fp:
  fp.write('\n'.join(dihedrals))

您可以在 python 中为该数组使用格式化输出。我们只需要使用 2+ 个空格拆分每一行以获得单独的字段。

import re

dihedrals=['na-2e-na-cd   4    1.200       180.000           2.000', 'Pd-2e-na-cd   4    1.200       180.000           2.000', 'Pd-2e-na-ca  4    1.200       180.000           2.000', 'Pd-4n-na-hn   4    4.800         0.000           2.000', 'na-4n-cc-cc   4    4.200       180.000           2.000', 'na-2e-na-ca   4    1.200       180.000           2.000', 'Pd-2e-na-ca   4    1.200       180.000           2.000', 'cc-4n-na-hn   4    4.800         0.000           2.000', 'Pd-4n-na-cd   4    4.800         0.000           2.000', 'Pd-2e-na-cc   4    1.200       180.000           2.000', 'X -4n-na-X   2    3.400       180.000           2.000', 'Pd-4n-cc-h4   4    4.200       180.000           2.000', 'Pd-4n-cc-cc   4    4.200       180.000           2.000', 'na-2e-na-cd  4    1.200       180.000           2.000', 'na-2e-na-cc  4    1.200       180.000           2.000', 'cc-4n-na-cd   4    4.800         0.000           2.000', 'na-2e-na-ca  4    1.200       180.000           2.000', 'Pd-2e-na-cc  4    1.200       180.000           2.000', 'na-2e-na-cc   4    1.200       180.000           2.000', 'Pd-2e-na-cd  4    1.200       180.000           2.000', 'na-4n-cc-h4   4    4.200       180.000           2.000']
for i in dihedrals:
     a = re.split(' {2,}', i)
     print( "%-11s  %2s   %8s   %12s  %12s" % (a[0], a[1], a[2], a[3], a[4]) )

输出:

na-2e-na-cd   4      1.200        180.000         2.000
Pd-2e-na-cd   4      1.200        180.000         2.000
Pd-2e-na-ca   4      1.200        180.000         2.000
Pd-4n-na-hn   4      4.800          0.000         2.000
na-4n-cc-cc   4      4.200        180.000         2.000
na-2e-na-ca   4      1.200        180.000         2.000
Pd-2e-na-ca   4      1.200        180.000         2.000
cc-4n-na-hn   4      4.800          0.000         2.000
Pd-4n-na-cd   4      4.800          0.000         2.000
Pd-2e-na-cc   4      1.200        180.000         2.000
X -4n-na-X    2      3.400        180.000         2.000
Pd-4n-cc-h4   4      4.200        180.000         2.000
Pd-4n-cc-cc   4      4.200        180.000         2.000
na-2e-na-cd   4      1.200        180.000         2.000
na-2e-na-cc   4      1.200        180.000         2.000
cc-4n-na-cd   4      4.800          0.000         2.000
na-2e-na-ca   4      1.200        180.000         2.000
Pd-2e-na-cc   4      1.200        180.000         2.000
na-2e-na-cc   4      1.200        180.000         2.000
Pd-2e-na-cd   4      1.200        180.000         2.000
na-4n-cc-h4   4      4.200        180.000         2.000

一个gnu-awk解决方案是:

... |
awk -F ' {2,}' -v RS=', *|\]' '
gsub(/dihedrals=\[|7/, "") {
   printf( "%-11s  %2s   %8s   %12s  %12s\n", , , , , )
}'

假设:

  • 第 1 列始终由 11 个字符组成

我不使用 python 所以我将使用 bash 数组和 bash/for 调用 awk:

的循环

设置:

declare -a dihedrals=([0]="na-2e-na-cd   4    1.200       180.000           2.000" [1]="Pd-2e-na-cd   4    1.200       180.000           2.000" [2]="Pd-2e-na-ca  4    1.200       180.000           2.000" [3]="Pd-4n-na-hn   4    4.800         0.000           2.000" [4]="na-4n-cc-cc   4    4.200       180.000           2.000" [5]="na-2e-na-ca   4    1.200       180.000           2.000" [6]="Pd-2e-na-ca   4    1.200       180.000           2.000" [7]="cc-4n-na-hn   4    4.800         0.000           2.000" [8]="Pd-4n-na-cd   4    4.800         0.000           2.000" [9]="Pd-2e-na-cc   4    1.200       180.000           2.000" [10]="X -4n-na-X   2    3.400       180.000           2.000" [11]="Pd-4n-cc-h4   4    4.200       180.000           2.000" [12]="Pd-4n-cc-cc   4    4.200       180.000           2.000" [13]="na-2e-na-cd  4    1.200       180.000           2.000" [14]="na-2e-na-cc  4    1.200       180.000           2.000" [15]="cc-4n-na-cd   4    4.800         0.000           2.000" [16]="na-2e-na-ca  4    1.200       180.000           2.000" [17]="Pd-2e-na-cc  4    1.200       180.000           2.000" [18]="na-2e-na-cc   4    1.200       180.000           2.000" [19]="Pd-2e-na-cd  4    1.200       180.000           2.000" [20]="na-4n-cc-h4   4    4.200       180.000           2.000")

建议代码:

for x in "${dihedrals[@]}"
do
    awk '{ f1=substr([=11=],1,11)
           split(substr([=11=],12),a)
           printf "%11s %2s %7s %12s %13s\n",f1,a[1],a[2],a[3],a[4]}' <<< "${x}"
done

这会生成:

na-2e-na-cd  4   1.200      180.000         2.000
Pd-2e-na-cd  4   1.200      180.000         2.000
Pd-2e-na-ca  4   1.200      180.000         2.000
Pd-4n-na-hn  4   4.800        0.000         2.000
na-4n-cc-cc  4   4.200      180.000         2.000
na-2e-na-ca  4   1.200      180.000         2.000
Pd-2e-na-ca  4   1.200      180.000         2.000
cc-4n-na-hn  4   4.800        0.000         2.000
Pd-4n-na-cd  4   4.800        0.000         2.000
Pd-2e-na-cc  4   1.200      180.000         2.000
X -4n-na-X   2   3.400      180.000         2.000
Pd-4n-cc-h4  4   4.200      180.000         2.000
Pd-4n-cc-cc  4   4.200      180.000         2.000
na-2e-na-cd  4   1.200      180.000         2.000
na-2e-na-cc  4   1.200      180.000         2.000
cc-4n-na-cd  4   4.800        0.000         2.000
na-2e-na-ca  4   1.200      180.000         2.000
Pd-2e-na-cc  4   1.200      180.000         2.000
na-2e-na-cc  4   1.200      180.000         2.000
Pd-2e-na-cd  4   1.200      180.000         2.000
na-4n-cc-h4  4   4.200      180.000         2.000

从性能的角度来看,我认为相同的 (awk) 逻辑应该在 python 内可行,因此无需重复调用 awk ... ???