Chinaunix

标题: awk文本处理 [打印本页]

作者: bbgg1983    时间: 2010-09-22 15:09
标题: awk文本处理
群里一哥们发的,大家娱乐一下:
  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
作者: expert1    时间: 2010-09-22 16:25
何时发的呀,我咋没看到呢?想标记着,等下想想思路
作者: expert1    时间: 2010-09-22 16:30
看不懂什么意思,囧
作者: nxlinux    时间: 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
复制代码

作者: expert1    时间: 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}'

对于多行的话这个不行了,应该考虑数组之类的,目前还没想到好办法。
作者: expert1    时间: 2010-09-22 22:12
本帖最后由 expert1 于 2010-09-23 08:23 编辑

化简一下,去掉$2无用的数据,把现在的$3当成$2.
a[$1]=$2,split{b[a],c)}
遍历c,打印之,感觉可行,有空考虑之。
==========================
但好像输出顺序不对了。
作者: expert1    时间: 2010-09-23 09:33
回复 1# bbgg1983


    any good idea?
作者: expert1    时间: 2011-07-08 18:06
回复 1# bbgg1983


    哥们最近在什么地方啊,怎么不见你冒泡了,有空聊2句,讨论shell啊




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2