免费注册 查看新帖 |

Chinaunix

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

[文本处理] 新手求助,2列数据怎么变成宽表形式 [复制链接]

论坛徽章:
0
发表于 2016-08-04 11:44 |显示全部楼层
例如有一个数据a.txt:

A,1
B,1
C,1
D,1
A,2
B,2
D,2
A,3
C,3
D,4


想得出数据如下b.txt:
A,1,2,3
B,1,2,0
C,1,3,0
D,1,2,4


问题: 匹配到$1的字段,有匹配值的输出到后一列中,没匹配到就输出0,求教大神awk应该怎么写呢

论坛徽章:
13
丑牛
日期:2013-08-16 15:08:22技术图书徽章
日期:2013-11-26 10:13:40双鱼座
日期:2013-11-08 15:03:26戌狗
日期:2013-11-08 13:52:30技术图书徽章
日期:2013-11-05 14:06:30戌狗
日期:2013-10-31 11:45:42CU十二周年纪念徽章
日期:2013-10-24 15:41:34天秤座
日期:2013-10-11 14:55:08子鼠
日期:2013-09-26 19:36:35水瓶座
日期:2013-09-26 17:44:56午马
日期:2013-08-26 10:24:23丑牛
日期:2013-08-19 14:43:22
发表于 2016-08-04 12:04 |显示全部楼层
本帖最后由 代号:军刀 于 2016-08-04 12:08 编辑
  1. awk -F"," 'BEGIN{max=0}{a[$1]=a[$1]?a[$1]","$2:$1","$2;b[$1]++;if(b[$1]>max){max=b[$1]}}END{for(i in a){if(b[i]<max){printf"%s,%s\n",a[i],0}else{print a[i]}}}' a.txt     

  2. A,1,2,3
  3. B,1,2,0
  4. C,1,3,0
  5. D,1,2,4
复制代码
根据你的描述我是看不太懂,随便写一个,结果跟你要的一样

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
发表于 2016-08-04 12:05 |显示全部楼层
本帖最后由 jason680 于 2016-08-04 12:07 编辑

回复 1# kwunkau

$ awk -F, '{a[$1]=a[$1]","$2;if(++c[$1]>M)M=c[$1]}END{t=asorti(a,b);for(n=1;n<=t;++n){k=b[n];for(m=1;m<=M-c[k];++m)a[k]=a[k]",0";print k a[k]}}' a.txt > b.txt

$ cat b.txt
A,1,2,3
B,1,2,0
C,1,3,0
D,1,2,4

   

论坛徽章:
28
15-16赛季CBA联赛之八一
日期:2016-02-22 19:10:4215-16赛季CBA联赛之深圳
日期:2016-12-01 10:34:0415-16赛季CBA联赛之新疆
日期:2016-12-07 10:24:2915-16赛季CBA联赛之同曦
日期:2016-12-15 12:06:43CU十四周年纪念徽章
日期:2016-12-18 13:03:4415-16赛季CBA联赛之吉林
日期:2017-01-03 15:52:2515-16赛季CBA联赛之辽宁
日期:2017-01-04 14:58:2415-16赛季CBA联赛之辽宁
日期:2017-01-15 09:42:512016科比退役纪念章
日期:2017-02-06 17:21:50黑曼巴
日期:2017-02-10 15:46:1215-16赛季CBA联赛之上海
日期:2017-03-18 10:14:5415-16赛季CBA联赛之青岛
日期:2017-03-18 22:00:44
发表于 2016-08-04 13:00 |显示全部楼层
本帖最后由 moperyblue 于 2016-08-04 13:01 编辑
  1. awk 'BEGIN{FS=OFS=","}
  2. {
  3.     a[$1]=a[$1]?a[$1] FS $2:$2
  4. }
  5. END{
  6.     for(i in a){
  7.         len=split(a[i],b)
  8.         maxLen=maxLen>len?maxLen:len
  9.     }
  10.     for(i in a){
  11.         len=split(a[i],b)
  12.         if(len<maxLen){
  13.             for(j=1;j<=maxLen-len;j++){
  14.                 a[i] = a[i] FS "0"
  15.             }
  16.         }
  17.     }
  18.     for(i in a){
  19.         print i,a[i]
  20.     }
  21. }' a.txt
复制代码

论坛徽章:
0
发表于 2016-08-04 15:16 |显示全部楼层
回复 2# 代号:军刀


问题可能表达不是很清楚,其实就是把这个换成宽表的形式,谢谢你的帮助了
   

论坛徽章:
0
发表于 2016-08-04 15:17 |显示全部楼层
回复 3# jason680

太谢谢了,去学习
   

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
发表于 2016-08-04 15:33 |显示全部楼层
  1. perl -F/,/ -nle '{push(@{$h{$F[0]}},$F[-1])}END{for(sort keys %h){$C=@{$h{$_}} if(!$P++);push(@{$h{$_}},0) while(@{$h{$_}}<$C);print join(",",$_,@{$h{$_}})}}' f
复制代码
A,1,2,3
B,1,2,0
C,1,3,0
D,1,2,4

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
发表于 2016-08-04 15:39 |显示全部楼层
代号:军刀 发表于 2016-08-04 12:04
根据你的描述我是看不太懂,随便写一个,结果跟你要的一样

我估计是楼主写错了, 要的是这样的结果:
A,1,2,3
B,1,2,0
C,1,0,3
D,1,2,4
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP