免费注册 查看新帖 |

Chinaunix

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

可否帮我看一下,我写的AWK有什么问题,怎么就出不来我要的效果 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-09-19 16:16 |只看该作者 |倒序浏览
Dear all

  我现在要做一个替换,具体要求是
程序遇到cl_setup,然后在第一个end if处后加一行cl_used....
  程序遇到end main,然后在其上面加一行cl_used
先把代码贴出

  1. !/bin/sh
  2. if [ $# -lt 1 ];then
  3.    echo "Usage:clused.sh bug_no"
  4.    echo "Ex   :clused.sh 'FUN-660010'"
  5.    exit 1
  6. fi
  7. bug_no=$1
  8. ls *4gl >fgl.lst

  9. while read col
  10. do
  11.   echo $col
  12.   sed '/CALL *cl_used(/d' $col > tmp1.tmp

  13. awk -v BUG=${bug_no} '
  14. {beg=0;pro=0}

  15. /IF.*cl_setup/{pro=1}

  16. pro==1&&/END IF/
  17. {print $0;
  18. print "CALL cl_used(g_prog,l_time,1) RETURNING l_time No.BUG";
  19. pro=0;
  20. beg=1;
  21. }

  22. /END MAIN/{
  23. print "CALL cl_used(g_prog,l_time,2) RETURNING l_time No.BUG"
  24. print $0;
  25. beg=1;
  26. }

  27. !(beg==1){print $0}
  28. ' tmp1.tmp > ${col}

  29. done<fgl.lst
  30. rm -rf fgl.lst 2>/dev/null
复制代码

也把范例贴一下,但是目前我发现上面的SHELL不WORK,


  1. MAIN
  2.    WHENEVER ERROR CALL cl_err_msg_log
  3.   
  4.    IF (NOT cl_setup("AIM")) THEN
  5.       EXIT PROGRAM
  6.    END IF


  7.    CALL p306_tm(0,0)  
  8. END MAIN
复制代码


还有一问是目前我的BUG这个变量取不到我在command line时传给它的值,

谢谢各位了

论坛徽章:
0
2 [报告]
发表于 2006-09-20 09:15 |只看该作者
哎,大虾帮忙呀

目前我run了一下下面的shell,里面的内容竟然成

  1.                                                                                 
  2. CALL cl_used(g_prog,l_time,1) RETURNING l_time No.BUG                           
  3. MAIN                                                                           
  4. CALL cl_used(g_prog,l_time,1) RETURNING l_time No.BUG                           
  5.    WHENEVER ERROR CALL cl_err_msg_log                                          
  6. CALL cl_used(g_prog,l_time,1) RETURNING l_time No.BUG                           
  7.                                                                                 
  8. CALL cl_used(g_prog,l_time,1) RETURNING l_time No.BUG                           
  9.    IF (NOT cl_setup("AIM")) THEN                                                
  10. CALL cl_used(g_prog,l_time,1) RETURNING l_time No.BUG                           
  11.       EXIT PROGRAM                                                              
  12. CALL cl_used(g_prog,l_time,1) RETURNING l_time No.BUG                           
  13.    END IF                                                                       
  14. CALL cl_used(g_prog,l_time,1) RETURNING l_time No.BUG                           
  15.                                                                                 
  16. CALL cl_used(g_prog,l_time,1) RETURNING l_time No.BUG                           
  17.                                                                                 
  18. CALL cl_used(g_prog,l_time,1) RETURNING l_time No.BUG                           
  19.    CALL p306_tm(0,0)                                                            
  20. CALL cl_used(g_prog,l_time,1) RETURNING l_time No.BUG                           
  21. END MAIN                                                                        
  22. CALL cl_used(g_prog,l_time,1) RETURNING l_time No.BUG                           
  23. CALL cl_used(g_prog,l_time,2) RETURNING l_time No.BUG
  24. END MAIN                                                                        
  25.                                                                                 
  26. CALL cl_used(g_prog,l_time,1) RETURNING l_time No.BUG
复制代码

我查错,基本上问题是在
pro==1&&/END IF/
{print $0;
print "CALL cl_used(g_prog,l_time,1) RETURNING l_time No.BUG";
pro=0;
beg=1;
}
中的print "CALL cl_used(g_prog,l_time,1) RETURNING l_time No.BUG";
可是不明白这句怎么会错呢

各位路过的,帮忙说明一下吧,谢谢

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
3 [报告]
发表于 2006-09-20 09:36 |只看该作者
{beg=0;pro=0}

/IF.*cl_setup/{pro=1}

pro==1&&/END IF/

以你的例子数据
最后一个判断永远为假

论坛徽章:
0
4 [报告]
发表于 2006-09-20 10:36 |只看该作者
目前测试下来,如你说得一样,可是我不明白
我的想法是这样的:
文中第一次出现cl_setup,我则将pro置为1
当pro=1时,且遇到第一个end if,我就在END IF的后面多打印一行啊
然后我就把变量都初始化了,为什么会是我贴出来的效果呀

awk 难道不是一行行这样分析的吗?
当一行中满足pattern了,就做处理,不满足就不做了

我的理解有误吗?

论坛徽章:
0
5 [报告]
发表于 2006-09-20 11:44 |只看该作者
Dear all

论坛徽章:
0
6 [报告]
发表于 2006-09-20 11:46 |只看该作者
Dear all

   看来是我写错东西了,目前代码如下就work了

  1. #!/bin/sh                                                                       
  2. if [ $# -lt 1 ];then                                                            
  3.    echo "Usage:clused.sh bug_no"                                                
  4.    echo "Ex   :clused.sh 'FUN-660010'"                                          
  5.    exit 1                                                                       
  6. fi                                                                              
  7. bug_no=$1                                                                       
  8. ls *4gl >fgl.lst                                                               
  9.                                                                                 
  10. while read col                                                                  
  11. do                                                                              
  12.   echo $col                                                                     
  13.   sed '/CALL *cl_used(/d' $col > tmp1.tmp                                       
  14.                                                                                 
  15. awk -v BUG=${bug_no} '                                                         
  16. {beg=0}                                                                        
  17.                                                                                 
  18. /cl_setup/{pro=1}                                                               
  19.                                                                                 
  20. {if (pro==1 && $0~/END IF/){                                                   
  21. print $0;                                                                       
  22. print "   CALL cl_used(g_prog,l_time,1) RETURNING l_time No."BUG;               
  23. pro=0;
  24. beg=1;                                                                          
  25. }                                                                              
  26. }                                                                              
  27.                                                                                 
  28. /END MAIN/{                                                                     
  29. print "   CALL cl_used(g_prog,l_time,2) RETURNING l_time No."BUG;               
  30. print $0;                                                                       
  31. beg=1;                                                                          
  32. }                                                                              
  33.                                                                                 
  34. !(beg==1){print $0}                                                            
  35. ' tmp1.tmp > ${col}                                                            
  36.                                                                                 
  37. done<fgl.lst                                                                    
  38. rm -rf fgl.lst 2>/dev/null

复制代码


谢谢各位的提醒
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP