如何将 gjf 格式转换为 xyz 格式?

如何将 gjf 格式转换为 xyz 格式?

gjf格式如下:

%chk=test.chk
# hf/3-21g geom=connectivity

Title Card Required

0 1
 C                  0.53424883    1.46721985   -0.02620215
 H                  0.89090326    0.45840985   -0.02620215
 H                  0.89092167    1.97161804    0.84744935
 H                  0.89092167    1.97161804   -0.89985366
 H                 -0.53575117    1.46723303   -0.02620215

 1 2 1.0 3 1.0 4 1.0 5 1.0
 2
 3
 4
 5

且 xyz 格式如下:

5     # this is the number of atoms

 C                  0.53424883    1.46721985   -0.02620215
 H                  0.89090326    0.45840985   -0.02620215
 H                  0.89092167    1.97161804    0.84744935
 H                  0.89092167    1.97161804   -0.89985366
 H                 -0.53575117    1.46723303   -0.02620215

答案1

这是一个快速而简单的 Awk 重构。

#!/bin/sh 

for file_name in *.gjf; do
    awk '/[0-9]\.[0-9][0-9]/ { a[++n] = $0 }
      END { print n; print; 
        for(i=1; i<=n; ++i) print a[i] }' "$file_name" > "${file_name%.gjf}.xyz"
done

简而言之,我们将匹配的行收集到数组中a,然后打印它们的编号、空行和行本身。

这显然要求您有足够的 RAM 来将所有行保存在内存中。如果没有,临时文件可能更好(但您的尝试仍可以从一些简单的重构中受益)。

答案2

我写了一些类似下面的东西,它有效,但它几乎是愚蠢的

#!/bin/bash 

 for file_name in *.gjf; do

 grep '[0-9]\.[0-9][0-9]' $file_name  | cat > tmp

 cp tmp tmp2 

 wc -l < tmp > ${file_name%.*}.xyz

 echo "" >> ${file_name%.*}.xyz

 cat tmp2 >> ${file_name%.*}.xyz

 rm tmp tmp2 

 done

答案3

这也很好,但并非总是如此!

#!/bin/bash

for file_name in *.gjf; do
tail -1 $file_name  > ${file_name%.*}.xyz
echo"" >> ${file_name%.*}.xyz
grep '[0-9]\.[0-9][0-9]' $file_name >> ${file_name%.*}.xyz
done

相关内容