用文件中的相应原子符号替换列中的原子序号

时间:2018-09-19 06:08:50

标签: bash awk sed grep

有人可以告诉我如何用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

让我知道是否有更好的方法来获得相同的输出。 谢谢。

0 个答案:

没有答案