免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1926 | 回复: 4

[文本处理] awk求助:如何讲一个数据块展开成多个 [复制链接]

论坛徽章:
0
发表于 2012-07-31 14:59 |显示全部楼层
本帖最后由 wawxdyy 于 2012-07-31 15:00 编辑

需要处理的文件中包含一系列如下数据块:

  1. NODE
  2.     label=LZ_[1,100]:[1,4]
  3.     name=lz[1,100]
  4.     ADDR
  5.         mask=24
  6.         addr=192.168.[1,50].[100,107]
  7.     ENDADDR
  8.     ADDR
  9.         mask=16
  10.         addr=10.[100,199].0.[100,103]
  11.     ENDADDR
  12. ENDNODE
复制代码
如何将上面这个数据块展开成400个如下的数据块,

  1. NODE
  2.     label=LZ_1:1
  3.     name=lz1
  4.     ADDR
  5.         mask=24
  6.         addr=192.168.1.100
  7.     ENDADDR
  8.     ADDR
  9.         mask=16
  10.         addr=10.100.0.100
  11.     ENDADDR
  12. ENDNODE

  13. ......

  14. NODE
  15.     label=LZ_100:1
  16.     name=lz100
  17.     ADDR
  18.         mask=24
  19.         addr=192.168.50.101
  20.     ENDADDR
  21.     ADDR
  22.         mask=16
  23.         addr=10.199.0.100
  24.     ENDADDR
  25. ENDNODE

  26. ......

  27. NODE
  28.     label=LZ_1:4
  29.     name=lz1
  30.     ADDR
  31.         mask=24
  32.         addr=192.168.1.106
  33.     ENDADDR
  34.     ADDR
  35.         mask=16
  36.         addr=10.100.0.103
  37.     ENDADDR
  38. ENDNODE

  39. ......

  40. NODE
  41.     label=LZ_100:4
  42.     name=lz100
  43.     ADDR
  44.         mask=24
  45.         addr=192.168.50.107
  46.     ENDADDR
  47.     ADDR
  48.         mask=16
  49.         addr=10.199.0.103
  50.     ENDADDR
  51. ENDNODE
复制代码

论坛徽章:
0
发表于 2012-07-31 15:15 |显示全部楼层
回复 1# wawxdyy


    这个需要awk么。。。我看还是用循环解决算了。。。

  1. ......
  2. xxx 97
  3. yyy 47
  4. xxx 98
  5. yyy 48
  6. xxx 99
  7. yyy 49
  8. personball@vostro:SHELL$cat test
  9. #!/bin/bash
  10. i=0
  11. while(( i<100 ))
  12. do
  13.         echo xxx $i
  14.         echo yyy $(( $i%50))
  15.         let "++i"
  16. done
  17. personball@vostro:SHELL$
复制代码

论坛徽章:
0
发表于 2012-07-31 15:53 |显示全部楼层
回复 2# personball


    是啊,肯定得用循环,我想过先用sed把每一个数据块取出来放到一个临时文件中,然后用循环把该数据块展开,但是很麻烦,用awk的话应该用更简洁高效,但是我这块我不太熟悉

论坛徽章:
0
发表于 2012-07-31 15:59 |显示全部楼层
回复 3# wawxdyy


    参考2楼
不变的文本都放到do done之间 echo出来
变化的数字部分,根据规律,利用索引值 i  进行求余就行了

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
发表于 2012-08-01 15:11 |显示全部楼层
我怎么看着不止400个呢?
  1. NODE
  2.     label=LZ_[1,100]:[1,4]     # 这里 100X 4, 已经400个变化了
  3.     name=lz[1,100]     # 这里好像是跟着上句变。
  4.     ADDR
  5.         mask=24
  6.         addr=192.168.[1,50].[100,107]   # 这个有 50 X 8 ,又是400个变化
  7.     ENDADDR
  8.     ADDR
  9.         mask=16
  10.         addr=10.[100,199].0.[100,103]   # 这里有 100 X 4, 有时 400个变化
  11.     ENDADDR
  12. ENDNODE
复制代码
也就是说,总共 400X 400 X 400 个变化。楼主再解释一下?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP