免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3890 | 回复: 5
打印 上一主题 下一主题

求助:awk脚本,条件语句不起作用了? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-04-18 08:36 |只看该作者 |倒序浏览
本帖最后由 huazhorg 于 2011-04-18 08:38 编辑

待处理的文本 cat tmpfile:

system
    ibrav= 12 celldm(1)= 10.38828296   
    celldm(3)= 4.44037202
    nat= 22, ntyp=4

awk脚本 cat test.awk:

#!/bin/awk -f
BEGIN{}
{
for(i=1;i<=NF;i++){
if($i=="celldm(1)="){a=$(i+1)}
     else{a=0}  
if($i=="celldm(2)="){b=$(i+1)}
     else{b=0}
if($i=="celldm(3)="){c=$(i+1)}
    else{c=0}
if($i=="celldm(4)="){d=$(i+1)}                  
    else{d=0}
}
}
END{
print "a="a;
print "b="b;
print "c="c;
print "d="d;
}

运行./test.awk tmpfile后,结果为
a=0
b=0
c=0
d=0
貌似条件语句没起作用?我希望结果是:
a=10.38828296
b=0
c=4.44037202
d=0
请问各位前辈,脚本该怎么改?

论坛徽章:
0
2 [报告]
发表于 2011-04-18 09:27 |只看该作者
本帖最后由 小小linux 于 2011-04-18 09:43 编辑

if($i=="celldm(1)="){a=$(i+1)}
     else{a=0}  

关键还是错在了 else {a=0}

比如在 下面这一行
ibrav= 12 celldm(1)= 10.38828296    此行有四个域
本来 在i=3 时匹配   执行 a=$(i+1)
但是  i=4 时 不匹配 执行 else{a=0}
然后 结束 。。所以 a=0

你把 else {a=0} 删了。。
  1. #!/bin/awk -f
  2. BEGIN{a=0;b=0;c=0;d=0}
  3. {
  4. for(i=1;i<=NF;i++){
  5. if($i=="celldm(1)="){a=$(i+1)}

  6. if($i=="celldm(2)="){b=$(i+1)}

  7. if($i=="celldm(3)="){c=$(i+1)}

  8. if($i=="celldm(4)="){d=$(i+1)}

  9. }
  10. }
  11. END{
  12. print "a="a;
  13. print "b="b;
  14. print "c="c;
  15. print "d="d;
  16. }
复制代码
执行结果:

a=10.38828296
b=0
c=4.44037202
d=0

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
3 [报告]
发表于 2011-04-18 09:32 |只看该作者
本帖最后由 jason680 于 2011-04-18 09:48 编辑
待处理的文本 cat tmpfile:

system
    ibrav= 12 celldm(1)= 10.38828296   
    celldm(3)= 4.4403 ...
huazhorg 发表于 2011-04-18 08:36


别在用a,b,c,d了,阵列也很好用...
  1. $ echo 'system
  2.     ibrav= 12 celldm(1)= 10.38828296   
  3.     celldm(3)= 4.44037202
  4.     nat= 22, ntyp=4
  5. '| awk 'BEGIN{for(i=0;i<4;i++)celldm[i]=0}
  6. {if(match($0,/celldm\(([0-9])\)= ([-0-9.]+)/,v))celldm[v[1]]=v[2]}
  7. END{for(i=0;i<4;i++)printf("celldm[%d]=%s\n",i,celldm[i])}'
  8. celldm[0]=0
  9. celldm[1]=10.38828296
  10. celldm[2]=0
  11. celldm[3]=4.44037202
复制代码

论坛徽章:
0
4 [报告]
发表于 2011-04-18 09:49 |只看该作者
本帖最后由 huazhorg 于 2011-04-18 09:51 编辑
别在用a,b,c,d了,阵列也很好用...
jason680 发表于 2011-04-18 09:32



    谢谢。当然你这个方法也不错。实际上这个脚本只是一部分,根据需要,用abcd是已经前面已经定义好的变量,这里只是测试一下,如果不用数组,而采用变量的方式呢?将abcd 遇到满足条件的,就赋值,否则就赋0,怎么改呢?

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
5 [报告]
发表于 2011-04-18 09:52 |只看该作者
谢谢。实际上这个脚本只是一部分,用abcd是已经前面已经定义好的变量,这里只是测试一下,如果不 ...
huazhorg 发表于 2011-04-18 09:49



请看二楼...

论坛徽章:
0
6 [报告]
发表于 2011-04-18 09:53 |只看该作者
本帖最后由 huazhorg 于 2011-04-18 10:12 编辑
if($i=="celldm(1)="{a=$(i+1)}
     else{a=0}  

关键还是错在了 else {a=0}

比如在 下面这一行
...
小小linux 发表于 2011-04-18 09:27



    你改进了你的办法,使得结果简洁明了,借鉴了!这个问题困扰我几天,原来只需要在开始的部分定义好就行了,好办法,谢谢了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP