24小时热门版块排行榜    

查看: 2189  |  回复: 21

cenwanglai

荣誉版主 (知名作家)

老和山猥琐派九段

优秀版主

★ ★
wo8165827(金币+1):谢谢参与
aylayl08(金币+1):感谢提示 2010-09-15 15:46:02
楼主注意,随意运行这个程序的话,你的log文件会非常多呢。要不你指定一个绝对路径。
11楼2010-09-12 11:56:46
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

wo8165827

金虫 (小有名气)

引用回帖:
Originally posted by ifmc1234 at 2010-09-11 21:03:47:

楼上正解,直接用bash里的脚本就行,没必要编程。

好像不行的。我建了一个run.sh文件。然后把你的命令加上。运行完后log里就只有一个‘E0=’ 其他数据都没有。

[ Last edited by wo8165827 on 2010-9-12 at 16:03 ]
计算的魅力
12楼2010-09-12 16:02:19
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

ifmc1234

木虫 (著名写手)

★ ★ ★
小木虫(金币+0.5):给个红包,谢谢回帖交流
zzy870720z(金币+2):谢谢详细指点 2010-09-13 08:26:52
wo8165827(金币+3):xiexie 2010-09-13 09:06:45
引用回帖:
Originally posted by wo8165827 at 2010-09-12 16:02:19:


好像不行的。我建了一个run.sh文件。然后把你的命令加上。运行完后log里就只有一个‘E0=’ 其他数据都没有。

[ Last edited by wo8165827 on 2010-9-12 at 16:03 ]

run.sh 文件里
第一行:#!/bin/bash 或者 #!/bin/sh
第二行 空
第三行开始是上面的命令。

其实就一行的命令,没必要写入脚本文件中。
我说的脚本指的是在linux脚本环境。

我猜你的不执行,可能是没加第一行。。。。。。
13楼2010-09-12 19:18:16
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

wo8165827

金虫 (小有名气)

引用回帖:
Originally posted by ifmc1234 at 2010-09-12 19:18:16:


run.sh 文件里
第一行:#!/bin/bash 或者 #!/bin/sh
第二行 空
第三行开始是上面的命令。

其实就一行的命令,没必要写入脚本文件中。
我说的脚本指的是在linux脚本环境。

我猜你的不执行,可能是没 ...

谢谢,不过还是不行。可以执行,但log文件里就只有‘E0=’这几个字符。E0的数据没有
计算的魅力
14楼2010-09-12 21:13:15
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

wangle_xq

银虫 (小有名气)

★ ★ ★ ★
小木虫(金币+0.5):给个红包,谢谢回帖交流
zzy870720z(金币+3):谢谢指导,这个厉害,linux编程高手,向你学习,呵呵 2010-09-13 08:27:31
wo8165827(金币+7):非常感谢 2010-09-13 09:07:10
引用回帖:
Originally posted by wo8165827 at 2010-09-12 21:13:15:


谢谢,不过还是不行。可以执行,但log文件里就只有‘E0=’这几个字符。E0的数据没有

估计错误处在没有明确指明awk的输出域。

语句grep "E0= " */OZSICAR | tail -1 | awk '{print $5}' >>log
应该改为grep "E0= " */OZSICAR | tail -1 | awk '{print $6}' >>log

容易出错的地方就在于*/OZSICAR
初次接触BASH,你要了解一下这个语句是什么意思。在这里简单解释一下。
grep是指在制定文件中逐行搜索并打印
“E0”是搜索的内容,如果该行含有查询内容则打印到标准输出(屏幕)
*/OSZICAR就是文件路径,是指当前路径下所有一级子目录中的OSZICAR。故,下级路径中必须包含OSZICAR否则路径无效。
|为管道,意思就是管道左边的输出作为管道右侧语句的输入。执行顺序为从左到右。管道可能不好理解。多用用就知道了,这里不多费笔墨。
tail为输出控制,打印输入的最后几行,-1指最后一行。
awk是BASH下的一个脚本工具。print $6的意思是打印第六个域包含的数值。

之前的脚本因为选择5为输出域,所以你得到的就是几个E0=。这个域正好是能量值的前一个。如果一开始不知道怎么分割域,挨个试试看就好了。

最后说说>和>>的区别,前一个为新建添加,后一个为增量添加。

楼主打算采用的这个方式一定要保证子目录文件名按照linux shell下的默认顺序排序。举例说明。现有文件夹1,2,11,12,112。
若按照数字大小,我们希望的顺序就是1,2,11,12,112
但是按照字母顺序的话,shell的默认顺序就是1,11,112,12,2
如果文件名命名为001,002,012。就不会出现顺序错误的问题。

我常用的脚本会加入循环。稍微复杂,但是方便直接生成整理后的数据文件
#!/bin/bash
for subfolder in 1 2 11 12 112
do
  echo -ne $subfolder"\t" >> log
  grep "E0= " $subfolder/OZSICAR | tail -1 | awk '{print $6}' >>log
done

[ Last edited by wangle_xq on 2010-9-13 at 04:37 ]
网络日志 http://blog.163.com/wangle_xq/ 关注计算材料科学的应用,以及相关的计算机技术。文章以转贴为主,少量原创。欢迎参观
15楼2010-09-13 04:24:25
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

wo8165827

金虫 (小有名气)

引用回帖:
Originally posted by wangle_xq at 2010-09-13 04:24:25:


估计错误处在没有明确指明awk的输出域。

语句grep "E0= " */OZSICAR | tail -1 | awk '{print $5}' >>log
应该改为grep "E0= " */OZSICAR | tail -1 | awk '{print $6}' >& ...

非常感谢您的详细指导。还有一个原因是,我的文件夹名是字母,如AgAg,AgAu,Agca,,,,等等。我将awk '{print $5}' 改为awk '{print $6}' 后只能生成一个E0的数据,要加入您设计的循环语句,不知道怎么加。谢谢。
计算的魅力
16楼2010-09-13 09:13:56
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

wangle_xq

银虫 (小有名气)

★ ★ ★ ★
小木虫(金币+0.5):给个红包,谢谢回帖交流
mazuju028(金币+3):谢谢交流 2010-09-13 21:18:11
不敢提设计。这是Bash里常用的语句,
subfolder为定义的变量
for 变量名 in 变量值
do
需要运行的语句
done
格式基本上就是这样。
对Bash编程有兴趣,可以看看网上的基础教程。
http://xiaowang.net/bgb-cn/

说回你的例子,
for subfolder in AgAg AgAu AgCa
do
echo -ne $subfolder"\t" >> log
  grep "E0= " $subfolder/OZSICAR | tail -1 | awk '{print $6}'  >> log
done
至于你说的只能生成一个的问题。不知道指什么,你可以把输入输出文件贴出来。
网络日志 http://blog.163.com/wangle_xq/ 关注计算材料科学的应用,以及相关的计算机技术。文章以转贴为主,少量原创。欢迎参观
17楼2010-09-13 10:38:12
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

wo8165827

金虫 (小有名气)

引用回帖:
Originally posted by wangle_xq at 2010-09-13 10:38:12:
不敢提设计。这是Bash里常用的语句,
subfolder为定义的变量
for 变量名 in 变量值
do
需要运行的语句
done
格式基本上就是这样。
对Bash编程有兴趣,可以看看网上的基础教程。
[url]http://xiaowang.ne ...

谢谢您的提示。
这是我的run.sh文件内容:

#!/bin/bash
grep "E0=" */OSZICAR | tail -1 | awk '{print $6}' >>log

我要提取E0的文件夹很多如:


您说的把所有文件名都放到run.sh里,而且我要换一些个文件名的话,这可能有点麻烦。不知道可否建立一个可以适合任意文件名的命令。谢谢。期待您的解答。
计算的魅力
18楼2010-09-13 11:12:46
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

wangle_xq

银虫 (小有名气)

★ ★ ★
小木虫(金币+0.5):给个红包,谢谢回帖交流
wo8165827(金币+5):辛苦了。 2010-09-13 13:51:08
aylayl08(金币+2):good 2010-09-15 15:46:28
引用回帖:
Originally posted by wo8165827 at 2010-09-13 11:12:46:

谢谢您的提示。
这是我的run.sh文件内容:

#!/bin/bash
grep "E0=" */OSZICAR | tail -1 | awk '{print $6}' >>log

我要提取E0的文件夹很多如:
[img]http://pic.muchong.com/201 ...

实在是不好解释,给你列出个例子,你看看吧。
CODE:
#:~/test$ cat AgCu/OSZICAR
reading files
WARNING: wrap around errors must be expected
entering main loop
      N     E                dE          d eps    ncg  rms     rms(c)
CG :  1   -.13238703E+04   -.132E+04   -.934E+02  56  .28E+02
CG :  2   -.13391360E+04   -.152E+02   -.982E+01  82  .54E+01
CG :  3   -.13397892E+04   -.653E+00   -.553E+00  72  .13E+01  .14E+00
CG :  4   -.13400939E+04   -.304E+00   -.287E+00  84  .48E+00  .39E-01
CG :  5   -.13401306E+04   -.366E-01   -.322E-01  69  .35E+00  .17E-01
CG :  6   -.13401489E+04   -.183E-01   -.169E-01  75  .74E-01  .66E-02
CG :  7   -.13401516E+04   -.267E-02   -.250E-02  68  .47E-01  .37E-02
CG :  8   -.13401522E+04   -.567E-03   -.489E-03  53  .15E-01  .90E-03
   1 F= -.13401522E+04 E0= -.13397340E+04  d E = -.13402E+04
.......
.......
   2 F= -.13401522E+04 E0= -.13397340E+04  d E = -.13402E+04
#:~/test$ ls *
AgAG:
OSZICAR

AgAu:
OSZICAR

AgCu:
OSZICAR
#:~/test$ grep "E0=" */OSZICAR
AgAG/OSZICAR:   1 F= -.13401522E+04 E0= -.13397340E+04  d E = -.13402E+04
AgAG/OSZICAR:   2 F= -.13401522E+04 E0= -.13397340E+04  d E = -.13402E+04
AgAu/OSZICAR:   1 F= -.13401522E+04 E0= -.13397340E+04  d E = -.13402E+04
AgAu/OSZICAR:   2 F= -.13401522E+04 E0= -.13397340E+04  d E = -.13402E+04
AgCu/OSZICAR:   1 F= -.13401522E+04 E0= -.13397340E+04  d E = -.13402E+04
AgCu/OSZICAR:   2 F= -.13401522E+04 E0= -.13397340E+04  d E = -.13402E+04

请注意这里的OSZICAR,我OSZICAR中都是含有两行能量输出值的。由于你的计算不知道在什么时候截止。所以在查找关键字的时候会出现上述重复的现象。而之前给出的命令,运行得到的结果如下。
CODE:
#:~/test$ grep "E0=" */OSZICAR | tail -1 | awk '{print $4}'
-.13401522E+04
#:~/test$ grep "E0=" */OSZICAR | tail -1 | awk '{print $5}'
E0=
#:~/test$ grep "E0=" */OSZICAR | tail -1 | awk '{print $6}'
-.13397340E+04

为了比较,列出了3个字段的运行结果。估计现在能明白字段的含义了。这里解释一下楼上给出的tail -1我当时没有细想,现在想来这个语句是不适用的。采用以下语句重复出现同一文件中的能量值。
CODE:
#:~/test$ grep "E0=" */OSZICAR
AgAG/OSZICAR:   1 F= -.13401522E+04 E0= -.13397340E+04  d E = -.13402E+04
AgAG/OSZICAR:   2 F= -.13401522E+04 E0= -.13397340E+04  d E = -.13402E+04
AgAu/OSZICAR:   1 F= -.13401522E+04 E0= -.13397340E+04  d E = -.13402E+04
AgAu/OSZICAR:   2 F= -.13401522E+04 E0= -.13397340E+04  d E = -.13402E+04
AgCu/OSZICAR:   1 F= -.13401522E+04 E0= -.13397340E+04  d E = -.13402E+04
AgCu/OSZICAR:   2 F= -.13401522E+04 E0= -.13397340E+04  d E = -.13402E+04

据我查看到的OSZICAR的内容,最后一行就是最终能量输出值,除非计算中途停止。若你可以保证计算均得到了正确的结果,可使用以下代码查看。(由于不同系统的Shell命令定义少有差别,我的代码是在Ubuntu的Bash下测试的。)
CODE:
#!/bin/sh
if [ -f log ]; then rm log; fi;
for subfolder in $(ls)
do
  if [ -d $subfolder ]
   then
     echo -n $subfolder"\t" >> log
     tail --line=1 $subfolder/OSZICAR | awk '{print $5}' >> log
  fi
done

网络日志 http://blog.163.com/wangle_xq/ 关注计算材料科学的应用,以及相关的计算机技术。文章以转贴为主,少量原创。欢迎参观
19楼2010-09-13 13:16:53
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

wangle_xq

银虫 (小有名气)

★ ★
小木虫(金币+0.5):给个红包,谢谢回帖交流
wo8165827(金币+5):谢谢您的提示。太感谢了。 2010-09-13 13:51:24
aylayl08(金币+1):谢谢提示 2010-09-15 15:46:39
引用回帖:
Originally posted by wo8165827 at 2010-09-13 11:12:46:
谢谢您的提示。
这是我的run.sh文件内容:

#!/bin/bash
grep "E0=" */OSZICAR | tail -1 | awk '{print $6}' >>log

我要提取E0的文件夹很多如:
[img]http://pic.muchong.com/201 ...

发完了才想起来,关于OSZICAR中的能量值。如果有多个,是由于几何优化产生的结果。VASP的手册上曾经有这么一段记述。在使用能量值的时候,不要使用几何优化产生的能量,要在几何优化结束以后另外固定原子位置和晶胞。所以一般在最后提取OSZICAR中能量时只有一行能量。
网络日志 http://blog.163.com/wangle_xq/ 关注计算材料科学的应用,以及相关的计算机技术。文章以转贴为主,少量原创。欢迎参观
20楼2010-09-13 13:35:20
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 wo8165827 的主题更新
普通表情 高级回复 (可上传附件)
信息提示
请填处理意见