如何在 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
... ???
我有这个数组:
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
... ???