Chinaunix首页 | 论坛 | 博客
  • 博客访问: 166796
  • 博文数量: 21
  • 博客积分: 2371
  • 博客等级: 大尉
  • 技术积分: 217
  • 用 户 组: 普通用户
  • 注册时间: 2009-01-15 18:36
文章分类

全部博文(21)

文章存档

2010年(6)

2009年(15)

分类:

2009-11-09 18:15:24

数据文件如下,以;分隔,-表示区间,需将带-的域展开,每行中带-的域个数及出现位置不定
 

[root@Mylinux tmp]# cat file
300;304-306;308
30;38-39;55;201-204;127


自定义一个函数splt

[root@Mylinux tmp]# awk 'BEGIN{FS=OFS=";"}function splt(f){split($f,M,"-");$f=M[1];for (i=M[1]+1;i<=M[2];i++) $f=$f";"i}{for (j=1;j<=NF;j++) if ($j~/-/) splt(j)}1' file
300;304;305;306;308
30;38;39;55;201;202;203;204;127


 
另一个例子:
 
 

[root@Mylinux tmp]# cat file
s1:s2:s3:host01,em01,10.0.0.1|host[02-07],em[02-07],10.0.0.[10-15]|host08,em08,10.0.0.23|host[001-004],em[01-04],10.0.0.[111-114]

期望输出

host01,em01,10.0.0.1
host02,em02,10.0.0.10
host03,em03,10.0.0.11
host04,em04,10.0.0.12
host05,em05,10.0.0.13
host06,em06,10.0.0.14
host07,em07,10.0.0.15
host08,em08,10.0.0.23
host001,em01,10.0.0.111
host002,em02,10.0.0.112
host003,em03,10.0.0.113
host004,em04,10.0.0.114


代码

awk -F '[:|]' 'function splt(v){split(v,M,",");split(M[1],host,"[][-]");split(M[2],em,"[][-]");split(M[3],addr,"[][-]");len_host=length(host[2]);len_em=length(em[2]);len_addr=length(addr[2]);num=host[3]-host[2];for (i=0;i<=num;i++) printf "%s%0"len_host"d,%s%0"len_em"d,%s%0"len_addr"d\n",host[1],host[2]+i,em[1],em[2]+i,addr[1],addr[2]+i}{for (j=4;j<=NF;j++) if ($j~/-/) splt($j);else print $j}' file


阅读(1634) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~