有人可以告诉我如何用bash脚本中的相应原子符号替换文件第一列中的原子序号吗?我有许多文件要用这种方式替换。
文件:HCOOH
6 0 -.134702 .401251 -.000249
8 0 -1.134262 -.264582 .000069
8 0 1.118680 -.091075 .000056
1 0 -.107617 1.495465 .000513
1 0 1.040484 -1.057714 -.000020
所需结果:
C 0 -.134702 .401251 -.000249
O 0 -1.134262 -.264582 .000069
O 0 1.118680 -.091075 .000056
H 0 -.107617 1.495465 .000513
H 0 1.040484 -1.057714 -.000020
我的目的是从基准论文中给出的基准数据库中提取系统的几何结构,论文“ J. Chem。Theory Comput。,2005,1(3),pp 415–432 DOI:10.1021 / ct049851d”。由于原子是数据库中的原子序数,因此我不能直接在NWCHEM代码中使用几何。因此,我需要将它们替换为相应的符号。使用脚本
#!/bin/bash
atoms=(HCOOH H He Li Be B C N O F Ne)
name="$(awk '{print $1}' HCOOH)"
rm atom
for j in ${name};
do
echo ${atoms[$j]} >>atom
done
awk 'FNR==NR{a[NR]=$1;next}{$1=a[FNR]}1' atom HCOOH | awk '{printf "%-3s %-1s %10.5f %10.5f %10.5f\n", $1, $2, $3, $4, $5}'
我得到
HCOOH 0.00000 0.00000 0.00000
C 0 -0.13470 0.40125 -0.00025
O 0 -1.13426 -0.26458 0.00007
O 0 1.11868 -0.09108 0.00006
H 0 -0.10762 1.49547 0.00051
H 0 1.04048 -1.05771 -0.00002
如果需要格式化输出,则我无法逃脱第一行中的零。如果有人可以帮助打印格式化的输出而不必在第一行中打印零,我会很高兴。
谢谢。
最后,使用脚本获得了预期的结果
#!/bin/bash
atoms=(HCOOH H He Li Be B C N O F Ne)
name="$(awk '{print $1}' HCOOH)"
rm atom
for j in ${name};
do
echo ${atoms[$j]} >>atom
done
awk 'FNR==NR{a[NR]=$1;next}{$1=a[FNR]}1' atom HCOOH | awk 'NR==1{printf "%-3s\n", $1}' >tHCOOH
awk 'FNR==NR{a[NR]=$1;next}{$1=a[FNR]}1' atom HCOOH | awk 'NR> 1{printf "%-3s %-1s %10.5f %10.5f %10.5f\n", $1, $2, $3, $4, $5}' >>tHCOOH #|
mv tHCOOH HCOOH
是
HCOOH
C 0 -0.13470 0.40125 -0.00025
O 0 -1.13426 -0.26458 0.00007
O 0 1.11868 -0.09108 0.00006
H 0 -0.10762 1.49547 0.00051
H 0 1.04048 -1.05771 -0.00002
让我知道是否有更好的方法来获得相同的输出。 谢谢。