免费注册 查看新帖 |

Chinaunix

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

awk文本处理 [复制链接]

论坛徽章:
0
发表于 2010-09-22 15:09 |显示全部楼层
群里一哥们发的,大家娱乐一下:
  1. 文件内容:
  2. 字段名     标识(0:无选项 >0:有多个选项)        字段值
  3. AAA           0                                 abcd
  4. BBB        2                                 0,1
  5. CCC        3                                 a,b,c
复制代码
需要通过以上文件得到下面这样6个字符串。
  1. <AAA>abcd</><BBB>0</><CCC>a</>
  2. <AAA>abcd</><BBB>0</><CCC>b</>
  3. <AAA>abcd</><BBB>0</><CCC>c</>
  4. <AAA>abcd</><BBB>1</><CCC>a</>
  5. <AAA>abcd</><BBB>1</><CCC>b</>
  6. <AAA>abcd</><BBB>1</><CCC>c</>
复制代码
如何才能实现??

说明: 标识中有一个0,表示没有选项,后面的字段值永远不变。
标识中有一个是2,表示有2两个选项。就有两种选择。0,1。两个选项都需要遍历一次
如果标识中为3,就表示有3个选项,这个字段就需要遍历3次。
所以得到的字符串是6个字符串,即2乘以3得到6个字符串。


第1行中AAA后面不会变abcd。BBB中取字段值中第1个值0,CCC取字段值中第1个值a
第2行中AAA后面不会变abcd。BBB中取字段值中第1个值0,CCC取字段值中第2个值b
第3行中AAA后面不会变abcd。BBB中取字段值中第1个值0,CCC取字段值中第3个值c
第4行中AAA后面不会变abcd。BBB中取字段值中第2个值1,CCC取字段值中第1个值a
第5行中AAA后面不会变abcd。BBB中取字段值中第2个值1,CCC取字段值中第2个值b
第6行中AAA后面不会变abcd。BBB中取字段值中第2个值1,CCC取字段值中第3个值c

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
发表于 2010-09-22 16:25 |显示全部楼层
何时发的呀,我咋没看到呢?想标记着,等下想想思路

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
发表于 2010-09-22 16:30 |显示全部楼层
看不懂什么意思,囧

论坛徽章:
2
IT运维版块每日发帖之星
日期:2016-02-10 06:20:01IT运维版块每日发帖之星
日期:2016-02-11 06:20:00
发表于 2010-09-22 19:52 |显示全部楼层
只能根据你上面的文件来实现,如果出现多个就不行了

  1. awk '$2==0{h=$1;hh=$3;next}{max=($2<n)?n:$2;min=($2>n)?n:$2;n=$2;a[$2]=$1","$3}END{for(i=1;i<=min;i++){for(l=1;l<=max;l++){split(a[min],B,",");split(a[max],C,",");f=i+1;e=l+1;printf "<"h">"hh"</><"B[1]">"B[f]"</><"C[1]">"C[e]"</>";printf "\n"}}}' urfile
复制代码

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
发表于 2010-09-22 21:53 |显示全部楼层
本帖最后由 expert1 于 2010-09-22 22:07 编辑

哦,看懂了,第二列垃圾数据没任何作用的。
NR==1记录$1,$2,然后NR>1,split $2,2个for循环打印出2,3行所有¥2的组合情况,最后打印出。

就这3行的话NR==2 split第二列,到a,NR==3的时候,split b,END{for (i in a){for (i in b)print 第一行,第二列的$1,a,第三列的$1,b}'

对于多行的话这个不行了,应该考虑数组之类的,目前还没想到好办法。

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
发表于 2010-09-22 22:12 |显示全部楼层
本帖最后由 expert1 于 2010-09-23 08:23 编辑

化简一下,去掉$2无用的数据,把现在的$3当成$2.
a[$1]=$2,split{b[a],c)}
遍历c,打印之,感觉可行,有空考虑之。
==========================
但好像输出顺序不对了。

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
发表于 2010-09-23 09:33 |显示全部楼层
回复 1# bbgg1983


    any good idea?

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
发表于 2011-07-08 18:06 |显示全部楼层
回复 1# bbgg1983


    哥们最近在什么地方啊,怎么不见你冒泡了,有空聊2句,讨论shell啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP