计算化学公社

标题: 求助:取出指定字段的文字我需要一个C语言小程序 [打印本页]

作者
Author:
liaorongbao    时间: 2024-1-28 10:07
标题: 求助:取出指定字段的文字我需要一个C语言小程序
我一直手动从log文件取出指定字段的内容,感觉很费事。
比如需要取出第一激发态结构优化后的波长和振子强度。就用记事本打开log文件搜索“Excited State   1:  ”然后不停地点查找下一个。直到最后一个,然后复制。


我现在想实现自动处理。比如,可否弄个C语言小程序,在程序中输入特定字段,输入文件路径和文件名,它就把我想要的结果输出到一个txt文件中。
实现这个目的,是不是需要先下载一个免费的C语言编译器,安装它。
然后写个小程序,中间指定搜索字符串。编译成可执行文件。然后用这个可执行文件执行我的log文件,把结果输出到指定的txt文件中?


各位老师都用的什么样的C语言编译器,是免费的么?你们把程序也分享给我吧,我不会写C语言。
具体怎么操作。请哪位老师详细解读一下。
或者,Multiwfn.exe是否自带这种功能?

作者
Author:
lyj714    时间: 2024-1-28 10:29
本帖最后由 lyj714 于 2024-1-28 10:31 编辑

不会C,基础都没有的话还是算了。你这需求完完全全就可以用shell命令解决了,非常容易。学一学sed,grep,awk这三个基础语法就能解决你的问题了。再不济python也很容易上手
作者
Author:
liaorongbao    时间: 2024-1-28 11:25
lyj714 发表于 2024-1-28 10:29
不会C,基础都没有的话还是算了。你这需求完完全全就可以用shell命令解决了,非常容易。学一学sed,grep,awk ...

谢谢!我研究研究shell命令
作者
Author:
sobereva    时间: 2024-1-29 04:35
认真看了此文就知道怎么做了
详谈Multiwfn的命令行方式运行和批量运行的方法
http://sobereva.com/612http://bbs.keinsci.com/thread-24929-1-1.html
作者
Author:
pal    时间: 2024-1-29 09:04
直接cat XXXX.log |grep "Excited State   1:"|tail -n 1 >> XXX.txt 不就好了
作者
Author:
philartist    时间: 2024-1-29 14:00
如果在windows下面的话FileLocator也不错,我一般用这个搜索某个文件夹下面一批任务中的Normal termination,stable,imaginary frequencies等等,不过想要看激发能和振子强度我觉得还是用cat和grep命令比较好,我在windows上都是用cmder这个程序执行cat和grep命令读取的
作者
Author:
zjxitcc    时间: 2024-1-29 15:13
这不需要会C语言,也不需要C语言(虽然C语言可以办到)
作者
Author:
shinkon    时间: 2024-2-2 14:38
啥都不会也行,问gpt
作者
Author:
北大-陶豫    时间: 2024-2-2 14:55
  1. [xx@jx2-login01 xx]$ python2
  2. Python 2.7.5 (default, Aug  7 2019, 00:51:29)
  3. [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)] on linux2
  4. Type "help", "copyright", "credits" or "license" for more information.
  5. >>> import subprocess as sp
  6. >>> sp.check_output(["grep ' nm ' ZINDO.log | head"], shell=True).strip().split("\n")
  7. ['Excited State   1:      Singlet-A      2.3556 eV  526.33 nm  f=0.0000  <S**2>=0.000', ' Excited State   2:      Singlet-A      2.3710 eV  522.92 nm  f=0.0000  <S**2>=0.000', ' Excited State   3:      Singlet-A      2.3720 eV  522.70 nm  f=0.0000  <S**2>=0.000', ' Excited State   4:      Singlet-A      2.9042 eV  426.91 nm  f=0.5039  <S**2>=0.000', ' Excited State   5:      Singlet-A      2.9057 eV  426.69 nm  f=0.4989  <S**2>=0.000', ' Excited State   6:      Singlet-A      2.9300 eV  423.15 nm  f=1.2019  <S**2>=0.000', ' Excited State   7:      Singlet-A      3.2962 eV  376.14 nm  f=0.0023  <S**2>=0.000', ' Excited State   8:      Singlet-A      3.3007 eV  375.63 nm  f=0.0021  <S**2>=0.000', ' Excited State   9:      Singlet-A      3.3014 eV  375.55 nm  f=0.0026  <S**2>=0.000', ' Excited State  10:      Singlet-A      3.6388 eV  340.73 nm  f=0.0000  <S**2>=0.000']
复制代码

作者
Author:
liaorongbao    时间: 2024-2-19 15:54
北大-陶豫 发表于 2024-2-2 14:55

谢谢您!
作者
Author:
Daniel_Arndt    时间: 2024-2-20 15:46
论坛里有awk语法小结 http://bbs.keinsci.com/thread-36574-1-1.html 。由于我不熟悉激发态的计算,手头也没有可以作为示例的输出文件,就瞎猜着写一个吧。
  1. awk '{ if ($1 == "Excited" && $2 == "State") print $0 }' file.log
复制代码
如果在此基础上再改进一点,就是这样。
  1. awk '{ if ($1 == "Excited" && $2 == "State") printf("%s %s\n", $7, substr($9, 3)) }' file.log
复制代码



作者
Author:
卡开发发    时间: 2024-2-21 08:47
用python处理依赖的包比较多,但反过来其实也意味着生态强大,此外也没系统限制。
以test0399.com的数据为例:
get_excited_data.py
  1. import sys
  2. import re
  3. import numpy as np
  4. import pandas as pd

  5. with open(sys.argv[1]) as f:
  6.         text=f.read()

  7. pattern='Excited State\s+(\d+?):.*\s+(.*?)\s+nm.*f=(.*?)\s+.*\n'
  8. data=re.findall(pattern,text)
  9. data=np.array(data).T
  10. df={
  11.         'excited state':np.array(data[0],int),
  12.         'wavelength':np.array(data[1],float),
  13.         'oscillator strength':np.array(data[2],float),
  14. }
  15. df=pd.DataFrame(df)
  16. print(df)
复制代码

执行python3 get_excited_data.py test0399.log,你可以得到:
  1.    excited state  wavelength  oscillator strength
  2. 0              1      225.55               0.0000
  3. 1              2      201.28               0.0000
  4. 2              3      194.06               0.0000
  5. 3              4      194.06               0.0000
  6. 4              5      180.14               0.0601
  7. 5              6      179.00               0.0000
复制代码

不同数据的结构都不会一样,短短几行很难包打天下,反过来说数据格式的标准化也很重要。
需要说明的是如果不需要格式排成pandas表格,其实在用正则表达式findall之后就可以直接输出了,这样对numpy和pandas的依赖也就不需要了。




欢迎光临 计算化学公社 (http://bbs.keinsci.com/) Powered by Discuz! X3.3