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