Chinaunix
标题:
awk文本处理
[打印本页]
作者:
bbgg1983
时间:
2010-09-22 15:09
标题:
awk文本处理
群里一哥们发的,大家娱乐一下:
文件内容:
字段名 标识(0:无选项 >0:有多个选项) 字段值
AAA 0 abcd
BBB 2 0,1
CCC 3 a,b,c
复制代码
需要通过以上文件得到下面这样6个字符串。
<AAA>abcd</><BBB>0</><CCC>a</>
<AAA>abcd</><BBB>0</><CCC>b</>
<AAA>abcd</><BBB>0</><CCC>c</>
<AAA>abcd</><BBB>1</><CCC>a</>
<AAA>abcd</><BBB>1</><CCC>b</>
<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
只能根据你上面的文件来实现,如果出现多个就不行了
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