免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 西门子
打印 上一主题 下一主题

一个比较恶心的拆分数据问题 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2008-06-30 13:17 |只看该作者
数据量不是很大。 也就几千行

论坛徽章:
7
荣誉版主
日期:2011-11-23 16:44:17子鼠
日期:2014-07-24 15:38:07狮子座
日期:2014-07-24 11:00:54巨蟹座
日期:2014-07-21 19:03:10双子座
日期:2014-05-22 12:00:09卯兔
日期:2014-05-08 19:43:17卯兔
日期:2014-08-22 13:39:09
22 [报告]
发表于 2008-06-30 13:33 |只看该作者
原帖由 西门子 于 2008-6-27 17:28 发表
感谢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,b}'    对答案的输出 处理不准确

没环境测试,你把$3="Y", 改成$3=="Y"试试

论坛徽章:
7
荣誉版主
日期:2011-11-23 16:44:17子鼠
日期:2014-07-24 15:38:07狮子座
日期:2014-07-24 11:00:54巨蟹座
日期:2014-07-21 19:03:10双子座
日期:2014-05-22 12:00:09卯兔
日期:2014-05-08 19:43:17卯兔
日期:2014-08-22 13:39:09
23 [报告]
发表于 2008-06-30 13:35 |只看该作者
原帖由 err7dd 于 2008-6-30 13:10 发表
数组有输出顺序的问题,另外数据量很大的话,会占用大量内存,我觉得对于数据量大的问题,减少使用数组

同意。数量特别大的应慎用数组,不过不知道要多大。

论坛徽章:
0
24 [报告]
发表于 2008-06-30 13:38 |只看该作者
改成== 就ok 了!!!
这里我就搞不明白了 到底awk 中 判断字符串 相等用什么啊 = 还是==

论坛徽章:
0
25 [报告]
发表于 2008-06-30 13:54 |只看该作者
介个灰常简单,因为我用 perl

论坛徽章:
7
荣誉版主
日期:2011-11-23 16:44:17子鼠
日期:2014-07-24 15:38:07狮子座
日期:2014-07-24 11:00:54巨蟹座
日期:2014-07-21 19:03:10双子座
日期:2014-05-22 12:00:09卯兔
日期:2014-05-08 19:43:17卯兔
日期:2014-08-22 13:39:09
26 [报告]
发表于 2008-07-01 08:36 |只看该作者
原帖由 redspider 于 2008-6-30 13:54 发表
介个灰常简单,因为我用 perl

丢段代码上来,欣赏一下

论坛徽章:
0
27 [报告]
发表于 2008-07-01 09:37 |只看该作者
only for the data that you  give
  1. awk '{a=$1;b=$2;getline;c=$2;{print a,b"|"c,b,"Y"}}' c
复制代码

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
28 [报告]
发表于 2008-07-01 10:00 |只看该作者
不受源文件大小的影响,但要求源文件已经是按题号排序的:
  1. $ awk '{if (num!=$1 && NR >1) {sub(/\|/,"",opt);print num"\t"opt"\t"y; opt=y=""}} { opt=opt"|"$2;num=$1} /Y/{y=$2}END{ sub(/\|/,"",opt);print num"\t"opt"\t"yes}'  urfile
复制代码


测试文本:
1151        更快、更高、更强        Y
1151        和平、友谊、进步      
1152        希腊雅典        Y
1152        法国巴黎      
1153        不是        Y
1153        是      
1154        五大洲        Y
1154        全人类      
1155        中国结        
1155        中国印        Y
9880        名正言顺                              
9880        名副其实        Y                       
9880        名声大振        

输出:
1151    更快、更高、更强|和平、友谊、进步       更快、更高、更强
1152    希腊雅典|法国巴黎       希腊雅典
1153    不是|是 不是
1154    五大洲|全人类   五大洲
1155    中国结|中国印   中国印
9880    名正言顺|名副其实|名声大振      名副其实

[ 本帖最后由 blackold 于 2008-7-1 10:01 编辑 ]

论坛徽章:
0
29 [报告]
发表于 2008-07-01 11:53 |只看该作者
试试这个

awk 'BEGIN{print "1\t 2\t 3"}{a[$1]=1;{if($3==Y)b[$1,$3]=$2;else c[$1]=$2}}END{for(j in a){print j,c[j]"|"b[j,Y],c[j]}}' file1.txt

我测试过这个的结果是满足楼主要求的,但是
if($3==Y)b[$1,$3]=$2;else c[$1]=$2}
这句我是想吧$3==Y时的 $2放到二维数组b数组,不匹配的放到c里,但是从结果看反了,不知道为什么?

[ 本帖最后由 smz0102 于 2008-7-1 13:04 编辑 ]

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
30 [报告]
发表于 2008-07-01 12:00 |只看该作者

回复 #29 smz0102 的帖子

测试了上面的urfile:
1        2       3
awk: (FILENAME=urfile FNR=13) fatal: attempt to use array `b' in a scalar context
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP