24小时热门版块排行榜    

查看: 627  |  回复: 2

meatball1982

铜虫 (小有名气)

[求助] 用awk修改原子序号

8:58 2013/5/20
我希望将各种原子类型的序号由1,2,3,...23.变成371,372,373,...,393。

1.要求用awk实现。
2.在polarize部分,原子的关联关系可能有很多。
3.程序要有相关的注释。


比如这一部分:

atom          1    1    C      "ser644              "     6     12.011    4

atom          2    2    N      "ser644              "     7     14.007    3
……
atom         23   23    H      "ser644              "     1      1.008    1

变成:

atom        371  371    C      "ser644              "     6     12.011    4

atom        372  372    N      "ser644              "     7     14.007    3
……
atom        393  393    H      "ser644              "     1      1.008    1


这一部分:

multipole     1   19    6             -5.25040

                                      -1.38471    0.00000    1.50161

                                       0.17141

                                       0.00000   -2.96582

                                       0.70579    0.00000    2.79441


变成:
multipole   371  389  376             -5.25040

                                      -1.38471    0.00000    1.50161

                                       0.17141

                                       0.00000   -2.96582

                                       0.70579    0.00000    2.79441


这一部分:
polarize      1               1.334      0.390       6   11

polarize      2               1.073      0.390       3   10

变成:
polarize    371               1.334      0.390     376  381

polarize    372               1.073      0.390     373  380
回复此楼

» 本帖附件资源列表

  • 欢迎监督和反馈:小木虫仅提供交流平台,不对该内容负责。
    本内容由用户自主发布,如果其内容涉及到知识产权问题,其责任在于用户本人,如对版权有异议,请联系邮箱:xiaomuchong@tal.com
  • 附件 1 : orig.key
  • 2013-05-20 09:07:39, 9.54 K

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

唉。还是学吧。
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

zeppe

金虫 (小有名气)

【答案】应助回帖

★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★
感谢参与,应助指数 +1
meatball1982: 金币+30, ★★★很有帮助, 就是这个。 2013-05-20 18:49:22
以下存为test.awk,使用时用命令
awk -f test.awk orig.key > targetfilename
CODE:
BEGIN{
#默认分隔符为空格,这里不需要改动.
}
{
#当第一列为atom
if(match($1,"atom"))
{
#按orig.key格式输出
printf("%s        %d  %d    %s      %s              %s     %s     %6.3f    %s\n",$1,$2+370,$3+370,$4,$5,$6,$7,$8,$9);
}
#当第一列为multipole
else if(match($1,"multipole"))
{
#按orig.key格式输出
printf("%s   %d  %d  %d             %8.5f\n",$1,$2+370,$3+370,$4+370,$5); #按orig.key格式输出
}
#当第一列为polarize
else if(match($1,"polarize"))   
{
printf("%s    %d               %s      %s   ",$1,$2+370,$3,$4);
#可能有多个要改的列
if(NF>4){
for(i = 5; i <= NF; ++i)
{
printf("%5d",$i + 370);
}
}
printf("\n");
}
#啥都不匹配则原样输出
else
{
printf("%s\n",$0);
}
}
END{
}

2楼2013-05-20 17:03:20
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

meatball1982

铜虫 (小有名气)

引用回帖:
2楼: Originally posted by zeppe at 2013-05-20 17:03:20
以下存为test.awk,使用时用命令
awk -f test.awk orig.key > targetfilename

BEGIN{
#默认分隔符为空格,这里不需要改动.
}
{
#当第一列为atom
if(match($1,"atom")
{
#按orig.key格式输 ...

收到,我试试哈。
唉。还是学吧。
3楼2013-05-20 18:42:58
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 meatball1982 的主题更新
信息提示
请填处理意见