一个比较恶心的拆分数据问题

西门子
一个比较恶心的拆分数据问题

题号        答案                 答案      
1151        更快、更高、更强        Y
1151        和平、友谊、进步       
1152        希腊雅典        Y
1152        法国巴黎       
1153        不是        Y
1153        是       
1154        五大洲        Y
1154        全人类       
1155        中国印        Y
1155        中国结       



单位给了一些 exlcel 数据,  如第一行1151 代表题号,后便的是答案选项, y 代表yes


也就是说,每2行  是一个题的 选项和答案。

                题号                选项                   答案
现在需要 整理成 题号      [color=Red]  选项1|选项2 [/color]    选项1    的形式。 比较恶心吧
谁能帮忙解决一下,将题号相同的行,合并成一行的问题

[[i] 本帖最后由 西门子 于 2008-6-27 17:10 编辑 [/i]]

blackold
回复 #1 西门子 的帖子

西门子搞错了吧,选项都一样?
[quote]现在需要 整理成 1151      [color=Red]更快、更高、更强[/color]|[color=Blue]更快、更高、更强 [/color]   更快、更高、更强    的形式。[/quote]

[[i] 本帖最后由 blackold 于 2008-6-27 16:50 编辑 [/i]]

西门子
没错,  最后一个是答案

即 :题 ----选项-----正确答案

无声无息
1151 更快、更高、更强 |和平、友谊、进步 更快、更高、更强

--------------华丽的分割线--------------------
是这个形式吧?

blackold
回复 #3 西门子 的帖子

那第二行(1151        和平、友谊、进步  )相当于没用了。 sort -u 后再sed

西门子
[quote]原帖由 [i]无声无息[/i] 于 2008-6-27 16:40 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8687606&ptid=1182195][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]
1151 更快、更高、更强 |和平、友谊、进步 更快、更高、更强

--------------华丽的分割线--------------------
是这个形式吧? [/quote]
理解完全正确!!!!!

walkerxk
不是‘1151      更快、更高、更强|和平、友谊、进步    更快、更高、更强’?听你的讲解应该是这个啊。

walkerxk
我的思路,删除Y和回车还有后面的一个字段,然后重复第二个字段,谁翻译成awk?感觉awk简单点。

西门子
我的思路是,先把  带y 的一行选出来重定向到一个文件中 然后 再两个文件比较。、
可是 我的语句不对,谁帮我检查一下
awk '{ if ($3=="Y") print $0}'  filename

Cocory
这个。。。俺也没看懂楼主意思

---------------------------------------


没想到刷新挺快

[[i] 本帖最后由 Cocory 于 2008-6-27 17:05 编辑 [/i]]

西门子
帮我看看上边那个输出的awk有问题吗!  awk '{if ($3== "Y")  print $0 }' book.txt

[[i] 本帖最后由 西门子 于 2008-6-27 17:17 编辑 [/i]]

blackold
回复 #11 西门子 的帖子

还是写一点吧:
[code]
$ awk '{if (!res[$1] ) res[$1]=$2; else {if ($3 ~ /Y/) res[$1]=$2"|"res[$1]"/t"$2; else /
res[$1]=res[$1]"|"$2"/t"res[$1]; print $1, res[$1]}}' urfile[/code]

[[i] 本帖最后由 blackold 于 2008-6-27 17:22 编辑 [/i]]

r2007
[code]awk '{if($1 in a)a[$1]=a[$1]"|"$2;else a[$1]=$2;if($3="Y")b[$1]=$2;}END{for(i in a)print i,a[i],b[i]}'[/code]

西门子
感谢r2007 的帮助 ,但是有点小bug
awk '{if($1 in a)a[$1]=a[$1]"|"$2;else a[$1]=$2;if($3="Y")b[$1]=$2;}END{for(i in a)print i,a[i],b[i]}'    对答案的输出 处理不准确

[[i] 本帖最后由 西门子 于 2008-6-30 12:32 编辑 [/i]]

灿烂小猪
awk '{a[$1]=a[$1]"|"$2" "a[$1]}END{for(i in a)print i,a[i]}' urfile


这样可不可以?

[[i] 本帖最后由 灿烂小猪 于 2008-6-27 17:59 编辑 [/i]]

err7dd
try:

[CODE]awk '{a=$1;b=$2;if($3~/Y/)c=$2;getline;d=$2;if($3~/Y/)c=$2;print a,b"|"d,c}'[/CODE]

西门子
awk '{a=$1;b=$2;if($3~/Y/)c=$2;getline;d=$2;if($3~/Y/)c=$2;print a,b"|"d,c}'  
这样也是个好办法

kingsu
排名第一的还是13楼楼长的。。。awk数组用法示范

西门子
[quote]原帖由 [i]kingsu[/i] 于 2008-6-30 11:46 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8701601&ptid=1182195][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]
排名第一的还是13楼楼长的。。。awk数组用法示范 [/quote]
难道你没有发现他的数组有问题吗????

我验证了他的程序 发现 ;if($3="Y")b[$1]=$2; 部分不能正确的 printe 出答案来,而是
输出了每行最后一个选项,作为正确答案。
我也看不出写的有什么毛病, 但结果就是不对
原始文件:
[color=Red]9880        名正言顺                               
9880        名副其实        Y                       
9880        名声大振        [/color]

处理完毕文件:

[color=Red]9880 名正言顺|名副其实|名声大振 名声大振[/color]
9881 一望无际|物美价廉|眼疾手快|五采缤纷 五采缤纷
9840 呢|吗|哇|呀 呀
9882 突然|仍然|不然 不然
9800 因|原|轮|期 期
9841 地方、处所|有价值 有价值
9883 因为..所以|不但..而且|虽然..但是 虽然..但是
9801 磨锋利|磨刀石|厉害|特别 特别
9842 保留-保存|坚固-牢固|承受-接受 承受-接受
9884 维护|爱护|保护 保护
9802 听见|消息|出名|用鼻子闻 用鼻子闻
9843 精美|栩栩如生|精彩 精彩
9885 李白|王维|杜甫|李绅 李绅
9570 认真听讲|都在家里睡觉|练习骑自行车 练习骑自行车
9803 顺着|按照|顺从|随着 随着
9844 飞流直下三千尺|遥看瀑布挂前川 遥看瀑布挂前川
9886 反问|比喻|拟人|夸张 夸张
9571 举办|旺盛|起来|振兴 振兴

其实答案是随即的。。。。。 这里的结果默认最后一个选项是 答案

[[i] 本帖最后由 西门子 于 2008-6-30 13:23 编辑 [/i]]

err7dd
数组有输出顺序的问题,另外数据量很大的话,会占用大量内存,我觉得对于数据量大的问题,减少使用数组