免费注册 查看新帖 |

Chinaunix

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

又一个shell(awk)编程问题,请教各位高手! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-06-17 11:45 |只看该作者 |倒序浏览
MX10 net5 net6 PM W=10 L=20
CC1-XI-1 net1 net2 CP area=25P $param=20
CC23-XI-5 net3 net4 CW area=140P $param=65
MD30 net7 net8 NM W=5 L=5

以上是一个文件,要求经过shell处理后
实现如下要求:
1。 以CC开头的行中的带$param这个字段被删除;
2。 以CC开头的行中的包含area这个字段的数字要被开平方,然后数值分配给W和L,并且这个值要带单位(u);
    例如:上面第二行被shell处理后要变成如下格式:
     CC1-XI-1 net1 net2 CP W=5u L=5u   
3。 把CC改成XC;

小弟在这方面实在是差劲,所以只有求助各位高手请赐教了!
多谢了!

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2003-06-17 12:46 |只看该作者

又一个shell(awk)编程问题,请教各位高手!

假设代码文件名为r,待处理文件名为filename
  1. cat r
  2. #!/usr/bin/awk -f
  3. {if($1~/^CC/){
  4.         $NF=""
  5.         split($5,a,"=")
  6.         split(a[2],b,"p")
  7.         $5=sprintf("W=%du L=%du",sqrt(b[1]),sqrt(b[1]))
  8.         gsub(/^CC/,"XC",$1)
  9.         }
  10.         print $0
  11. }
  12. 调用方式
  13. awk -f r filename
  14. 执行结果
  15. MX10 net5 net6 PM W=10 L=20
  16. XC1-XI-1 net1 net2 CP W=5u L=5u
  17. XC23-XI-5 net3 net4 CW W=11u L=11u
  18. MD30 net7 net8 NM W=5 L=5
复制代码
   
红侠学的,不知可否达到楼主的要求?

论坛徽章:
0
3 [报告]
发表于 2003-06-17 12:49 |只看该作者

又一个shell(awk)编程问题,请教各位高手!

格式固定不?
CC23-XI-5 net3 net4 CW area=140P $param=65
每一行都是六个字段吗?
140开平方应该的多少(你要求)?

论坛徽章:
0
4 [报告]
发表于 2003-06-17 13:06 |只看该作者

又一个shell(awk)编程问题,请教各位高手!

[$urStr="";
$sqr="";
open(INPUT,"input"||die("can't open the file IN";
open(OUTPUT,">output"||die("can't open the file OUT";
while($outData=<INPUT>{
        $urStr="";
        if($outData =~ /^CC/){
                    $outData =~ s/CC/XC/;
            @outArr=split(" ",$outData);
              foreach $iCnt(@outArr){
                    if($iCnt =~ /.*area=(\d+)P/){
                        $sqr="w=".int(sqrt($1))."u "."l=".int(sqrt($1))."u ";
                        $urStr=$urStr." ".$sqr;
                    }
                        if(($iCnt !~ /\$param=[0-9]*/)&&($iCnt !~ /.*area=[0-9]*/)){
                    $urStr=$urStr." ".$iCnt;
                    }        
           }
               print OUTPUT $urStr."\n";
    }else{
            print OUTPUT $outData;
        }
}       
close(OUTPUT)||die("can't close the file OUT";
close(INPUT)||die("can't close the file OUT";

论坛徽章:
0
5 [报告]
发表于 2003-06-17 13:09 |只看该作者

又一个shell(awk)编程问题,请教各位高手!

[quote]原帖由 "admirer"]У模?恢?煞翊锏铰ブ鞯囊?螅縖/quote 发表:
   
不会吧,GSUB不是GAWK的吗?难道也可以直接用??还有SPRINTF不是NAWK的吗?他们都可以在一起使用吗?要是可以的话,我可就真的走了弯路了~~

论坛徽章:
0
6 [报告]
发表于 2003-06-17 13:11 |只看该作者

又一个shell(awk)编程问题,请教各位高手!

awk '{ if($1~/^CC/){if($6~/\$param/) $6="";} print $0;}' a.txt |
sed  -e 's/^CC/XC/' -e 's/area=\([0-9]*\)P/\1 PPP/' |
awk '{if($6=="PP" {$6=sprintf("L=%du",sqrt($5));$5=sprintf("W=%du",sqrt($5));}print $0}'
是不是太复杂了?   

论坛徽章:
0
7 [报告]
发表于 2003-06-17 14:04 |只看该作者

又一个shell(awk)编程问题,请教各位高手!

谢谢各位大侠的无私帮助!

请教peterbingxu:
   
  sed -e 's/^CC/XC/' -e 's/area=\([0-9]*\)P/\1 PPP/'

这句中的后半句能不能给我解释一下,我很笨的!

to admirer:
  gsub 不能用呀!

论坛徽章:
0
8 [报告]
发表于 2003-06-17 15:01 |只看该作者

又一个shell(awk)编程问题,请教各位高手!

to admirer:
   
     请教一下split的用法!就结合上面的例子来解释吧!
  
     谢谢!

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
9 [报告]
发表于 2003-06-17 15:16 |只看该作者

又一个shell(awk)编程问题,请教各位高手!

我是SCO UNIX 5.0.5 在我的机子上awk,nawk都可以执行的
  1. #nawk -f r a
  2. MX10 net5 net6 PM W=10 L=20
  3. XC1-XI-1 net1 net2 CP W=5u L=5u
  4. XC23-XI-5 net3 net4 CW W=11u L=11u
  5. MD30 net7 net8 NM W=5 L=5
  6. # awk -f r a
  7. MX10 net5 net6 PM W=10 L=20
  8. XC1-XI-1 net1 net2 CP W=5u L=5u
  9. XC23-XI-5 net3 net4 CW W=11u L=11u
  10. MD30 net7 net8 NM W=5 L=5
复制代码

split的用法
  1. split(string,store,delim)  根据分界符delim,分解string为store的数组元素
复制代码

论坛徽章:
0
10 [报告]
发表于 2003-06-17 15:52 |只看该作者

又一个shell(awk)编程问题,请教各位高手!

谢谢admirer的指点:

   不过我这边用的是solaris2.8,所以gsub还是不能用!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP