24小时热门版块排行榜    

查看: 2756  |  回复: 24

asaka

银虫 (初入文坛)

★ ★ ★ ★ ★
zhou2009(金币+5): 2011-12-11 20:11:34
shell版实在是太慢,既然要用到python,那就纯python吧,速度快多了。
CODE:
#!/usr/bin/env python
import sys
block='Population'
eigen='eigenvalues'
occst='occ'
virst='vir'
sepst='--'
for filename in sys.argv[1:] :
  f=open(filename,'r')
  txt=f.read().splitlines()
  f.close()
  for line in txt :
    if line.find(block) > -1 or line.find(eigen) > -1 :
      if line.find(block) > -1 :
        eocc=[]
        evir=[]
      elif line.find(occst) > -1 :
        data=line.split(sepst)[1]
        eocc=eocc+[float(i) for i in data.split()]
      elif line.find(virst) > -1 :
        data=line.split(sepst)[1]
        evir=evir+[float(i) for i in data.split()]
  print "File :",filename
  if len(eocc) > 0 : print "  HOMO :",max(eocc)
  if len(evir) > 0 : print "  LUMO :",min(evir)

11楼2011-12-09 17:40:15
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

秋雨子

金虫 (小有名气)

送鲜花一朵
引用回帖:
9楼: Originally posted by asaka at 2011-12-09 04:13:39:
说一下我的想法啊:

首先用grep把有用的输出信息过滤一下:
一个是分割各个计算结果,免得把好几个计算的信息混在一起,
另外也是楼主要求的,只输出最后的结果,
另一个就是各个轨道能的数据。

然后把占 ...

非常感谢您的不吝赐教!思路很清晰 ,不过我还有一点小问题,麻烦您再解答一下,我只会用一点shell,python不知道怎么用,我把您的命令粘帖到text里面,运行了一下 没有输出文件,我把后面的python写的那两行删了,让程序输出到一个文件a里面,里面什么也没有,实在是初学加自学,希望高手可以耐心解释下!
To the time to life, rather than to life in time
12楼2011-12-09 21:38:52
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

秋雨子

金虫 (小有名气)

引用回帖:
12楼: Originally posted by 秋雨子 at 2011-12-09 21:38:52:
非常感谢您的不吝赐教!思路很清晰 ,不过我还有一点小问题,麻烦您再解答一下,我只会用一点shell,python不知道怎么用,我把您的命令粘帖到text里面,运行了一下 没有输出文件,我把后面的python写的那两行删了 ...

补充一下,我的文件全是以row001.log,row002.log这种格式命名的,一共一两万个,分子都是opt+freq,所以输出文件没有什么太大的不同,只是优化的圈数不同,文件内容如原来上传的row1.log。
To the time to life, rather than to life in time
13楼2011-12-09 21:43:37
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

秋雨子

金虫 (小有名气)

引用回帖:
11楼: Originally posted by asaka at 2011-12-09 17:40:15:
shell版实在是太慢,既然要用到python,那就纯python吧,速度快多了。
[code]
#!/usr/bin/env python
import sys
block='Population'
eigen='eigenvalues'
occst='occ'
virst='vir'
sepst='--'
for file ...

刚痛苦的自学了半年的shell,不会还得再自学python吧!能不能写个单纯的shell的程序啊?将非常感谢,并奉上金币!
To the time to life, rather than to life in time
14楼2011-12-09 21:52:40
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

mchen10

金虫 (正式写手)

【答案】应助回帖

★ ★ ★ ★ ★
zhou2009(金币+5): 2011-12-11 20:12:00
秋雨子(金币+10): 非常感谢!谢谢交流!我试了下输出的只有文件名字,没有homo,lumo能量,还是我太笨,再仔细研究下!仍然感谢! 2011-12-11 20:32:30
我来段bash吧 献拙了
CODE:
#!/bin/bash
# print homo lumo energy of gaussian output
# usage: print_homo_lumo filename(s)
for file in "$@"
do
echo $file
tac $file | tr "\n" "@" | egrep -o "@ Alpha virt\. eigenvalues.{0,75}@ Alpha  occ\. eigenvalues.{0,75}@ Alpha  occ\. eigenvalues" tio2.rev| tr "@" "\n" | head -n3 | awk '{if ($2 == "virt.") print $1" LUMO "$5; if($2 == "occ."){i=NF; print $1" HOMO "$i} }'
done

更痛苦的是梦没醒路已经不能走了
15楼2011-12-10 02:54:54
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

ZDBWHZ

金虫 (正式写手)

【答案】应助回帖

★ ★ ★ ★ ★
zhou2009(金币+5): 2011-12-11 20:12:18
秋雨子(金币+40): 没有错误,不用修改可以直接搞定!也不用再学习新的语言,非常感谢! 2011-12-11 20:26:28
直接shell:
#!/bin/sh
# ZDB, HNU, 2011/11/15.
# ZDB, HNU, 2011/11/23 modified to be more pratical.
`ls -l *.log | awk '{print $9}' | sed 's/.log//g' > file_list`
cat file_list | while read each_file
do
    file1=./$each_file".log"
    HOMO=`grep 'Alpha  occ.' $file1 | tail -n 1 | awk '{print $NF}'`
    `grep '^.Alpha virt.' $file1 > tmp`
    total_line=`awk '{print $1}' tmp | wc -l`
    blockflag=`grep 'Population analysis' $file1 | wc -l`
    if [ $blockflag == "1" ]
    then
        start_n=`expr ${total_line} \* 1 / 2 + 1`
    elif [ $blockflag == "2" ]
    then
        start_n=`expr ${total_line} \* 1 / 2 + 1`
    else
        start_n=`expr ${total_line} \* 2 / 3 + 1`
    fi
    LUMO=`sed -n ''$start_n'p' tmp | awk '{print $5}'`
    echo $each_file $HOMO $LUMO >> extract.txt
done

» 本帖已获得的红花(最新10朵)

16楼2011-12-10 13:31:18
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

ZDBWHZ

金虫 (正式写手)

【答案】应助回帖

★ ★
zhou2009(金币+2): 2011-12-11 20:13:03
这样最后的txt文档数据可以导入到origin等软件,再转到Excel进行后续的DFRT指数计算。
17楼2011-12-10 13:32:46
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

asaka

银虫 (初入文坛)

★ ★ ★
zhou2009(金币+3): 2011-12-11 20:13:17
以上作者只考虑闭壳层计算的情况,你有开壳层的计算吗?那时候你需要总的HOMO,LUMO还是分别alpha以及beta的HOMO和LUMO?
他们的程序都只有一点小问题,相信LZ可以搞定。
mchen10 的程序少了一个 |,多了一个奇怪的tio2.rev
ZDBWHZ 的程序用ls -l *.log可能会碰到兼容性问题,还不如直接ls *.log | sed .
18楼2011-12-10 16:33:17
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

mchen10

金虫 (正式写手)

【答案】应助回帖

引用回帖:
18楼: Originally posted by asaka at 2011-12-09 20:33:17:
以上作者只考虑闭壳层计算的情况,你有开壳层的计算吗?那时候你需要总的HOMO,LUMO还是分别alpha以及beta的HOMO和LUMO?
他们的程序都只有一点小问题,相信LZ可以搞定。
mchen10 的程序少了一个 |,多了一个奇怪 ...

CODE:
#!/bin/bash
# print homo lumo energy of gaussian output
# usage: print_homo_lumo filename(s)
for file in "$@"
do
echo $file
tac $file | tr "\n" "@" | egrep -o "@ Alpha virt\. eigenvalues.{0,75}@ Alpha  occ\. eigenvalues.{0,75}@ Alpha  occ\. eigenvalues" | tr "@" "\n" | head -n3 | awk '{if ($2 == "virt.") print $1" LUMO "$5; if($2 == "occ."){i=NF; print $1" HOMO "$i} }'
done

抱歉,tio2.rev是测试产物 去掉就好了(留着也不影响)
至于开壳闭壳的问题,我们给个思路 楼主如果什么都让别人来搞定 就算程序可以用 真正的收益也就那么一点点

» 本帖已获得的红花(最新10朵)

更痛苦的是梦没醒路已经不能走了
19楼2011-12-11 04:06:32
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

秋雨子

金虫 (小有名气)

送鲜花一朵
引用回帖:
16楼: Originally posted by ZDBWHZ at 2011-12-10 13:31:18:
直接shell:
#!/bin/sh
# ZDB, HNU, 2011/11/15.
# ZDB, HNU, 2011/11/23 modified to be more pratical.
`ls -l *.log | awk '{print $9}' | sed 's/.log//g' > file_list`
cat file_list | while read  ...

非常感谢!完美的解决了我的问题!不胜感激!话不多说了,通知版主奉上金币,也非常谢谢您能分享这个脚本,让菜鸟可以多学习学习!
To the time to life, rather than to life in time
20楼2011-12-11 20:04:32
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 秋雨子 的主题更新
信息提示
请填处理意见