|
|
本帖最后由 ChemiAndy 于 2018-4-28 17:25 编辑
我所有的gjf在计算设置行(#开始的行)之前都没有空行,所以我的脚本没有考虑这种意外。我针对你给出的gjf文件修改了脚本,考虑了存在空行的可能性。新脚本
- #!/bin/bash
- PREFIX=`echo $1| sed 's/\..*$//'`
- #Start line number
- M_START=$(sed -n '/^#/,$p' $1 | grep -n '^\s* | head -2 | tail -1 | sed 's/://')
- M_END=$(sed -n '/^#/,$p' $1 | grep -n '^\s* | head -3 | tail -1 | sed 's/://')
- N_START=$((M_START+1))
- N_END=$((M_END-1))
- echo "$((N_END - N_START))" > ${PREFIX}.xyz
- sed -n '/^#/,$p' $1 | sed -n "${N_START},${N_END}p" >> ${PREFIX}.xyz
- echo "Please check the generated xyz file:"
- echo "--------------------------------------------------------------"
- cat ${PREFIX}.xyz
- echo "--------------------------------------------------------------"
- echo "Done!"
复制代码
运行结果:
- ./gjf2xyz wat.gjf
- Please check the generated xyz file:
- --------------------------------------------------------------
- 3
- 0,1
- O -0.00000 0.00000 6.84784
- H -0.78400 0.00000 6.29384
- H 0.78400 0.00000 6.29384
- --------------------------------------------------------------
复制代码
解释:
1. 这个脚本就是提取#行之后的所有行,然后根据gaussian输入文件的空行规则,从第二个空行的第二行开始,到第三个空行之前一行结束,为gjf的xyz坐标行(对Z坐标无效),直接输出。
2. xyz文件的前两行:一般第一行第一个数字为总原子数,第二行无规则,我这里直接把总电荷和自旋数写上,以便输出成其他软件的输入文件时使用;
你试下,有错误告诉我。
正则表达式和sed/grep结合使用编写shell脚本是十分强大的,值得花点时间摸索一下。
|
|