免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4196 | 回复: 7
打印 上一主题 下一主题

[文本处理] 两列数据如何转化成矩阵 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-12-06 14:19 |只看该作者 |倒序浏览
各位大神,如何将下面两列数据转化成矩阵呢
0553pv        Target
0190pt        823
0370pt        770
0543pt        769
0554nv        Target
0190pt        961
0023nt        942
0036nt        924
0555pv        Target
0029pt        901
0118pt        875
0434pt        842
如何转化成矩阵? 我想把第一列以pv结尾的名字作为矩阵的第一列,然后以pt命名的作为第一行,首先按照pv分割,每两个pv之间的pt内容是表述上面一个pv性质的。假设0553pv下面有0190pt,值为823,,那么在第一行第一列就是823.
           0190pt        0370pt        0543pt        0023pt        0036pt        0029pt        0118pt        0434pt
0553pv        823        770        769        0        0        0        0        0
0554nv        961        0        0        942        924        0        0        0
0555pv        0        0        0        0        0        901        875        842

我是新手,对于这个复杂的情况就不会整了,请教各位大神

论坛徽章:
54
2015亚冠之德黑兰石油
日期:2015-07-07 13:00:1615-16赛季CBA联赛之深圳
日期:2016-03-31 09:03:5415-16赛季CBA联赛之辽宁
日期:2016-05-09 20:38:15程序设计版块每日发帖之星
日期:2016-05-12 06:20:0015-16赛季CBA联赛之四川
日期:2016-05-13 15:19:4715-16赛季CBA联赛之福建
日期:2016-05-15 20:24:34每日论坛发贴之星
日期:2016-05-16 06:20:0015-16赛季CBA联赛之吉林
日期:2016-05-26 11:49:4715-16赛季CBA联赛之广东
日期:2016-05-26 13:49:18极客徽章
日期:2016-12-07 14:05:2315-16赛季CBA联赛之广夏
日期:2016-12-20 17:33:532017金鸡报晓
日期:2017-01-10 15:19:56
2 [报告]
发表于 2015-12-06 15:13 |只看该作者
本帖最后由 haooooaaa 于 2015-12-06 15:26 编辑
  1. awk '$1~/v$/{s=$1;next}{if(l!~$1)l=l?l"\t"$1:$1;h[s][$1]=$2}END{split(l,t);print "\t"l;for(i in h){s=i;for(j in t)s=h[i][t[j]]?s"\t"h[i][t[j]]:s"\t"0;print s}}' file
  2.         0190pt  0370pt  0543pt  0023nt  0036nt  0029pt  0118pt  0434pt
  3. 0554nv  961     0       0       942     924     0       0       0
  4. 0555pv  0       0       0       0       0       901     875     842
  5. 0553pv  823     770     769     0       0       0       0       0
复制代码

论坛徽章:
20
卯兔
日期:2015-01-26 22:05:142015亚冠之萨济拖拉机
日期:2015-09-10 15:15:282015亚冠之阿尔希拉尔
日期:2015-09-25 17:37:53程序设计版块每日发帖之星
日期:2015-10-03 06:20:00程序设计版块每日发帖之星
日期:2015-12-09 06:20:00CU十四周年纪念徽章
日期:2015-12-17 09:07:15程序设计版块每日发帖之星
日期:2015-12-25 06:20:34程序设计版块每日发帖之星
日期:2015-12-25 06:20:34程序设计版块每日发帖之星
日期:2015-12-25 06:20:342015亚冠之广州富力
日期:2015-08-27 19:29:56每日论坛发贴之星
日期:2015-08-26 06:20:002015亚冠之阿尔希拉尔
日期:2015-05-18 17:26:27
3 [报告]
发表于 2015-12-06 15:16 |只看该作者
  1. $ awk '
  2. /Target$/{
  3.      s=$1
  4.      a[++x]=$1
  5.      next
  6. }
  7. {
  8.     b[s,$1]=$2
  9.     if(!d[$1]++)
  10.         c[++y]=$1
  11. }
  12. END{
  13.     for(i=1;i<=x;i++){
  14.         if(i==1){
  15.              for(k=1;k<=y;k++){
  16.                  p="\t"c[k]
  17.                  p=k==y?p"\n":p
  18.                  printf p
  19.              }
  20.         }
  21.         for(j=1;j<=y;j++){
  22.             p=b[a[i],c[j]]?b[a[i],c[j]]:0
  23.             p=j==1?a[i]"\t"p:p
  24.             p=j==y?p"\n":p"\t"
  25.             printf p
  26.         }
  27.     }
  28. }' file
  29.         0190pt  0370pt  0543pt  0023nt  0036nt  0029pt  0118pt  0434pt
  30. 0553pv  823     770     769     0       0       0       0       0
  31. 0554nv  961     0       0       942     924     0       0       0
  32. 0555pv  0       0       0       0       0       901     875     842
复制代码

评分

参与人数 1信誉积分 +50 收起 理由
tainche + 50

查看全部评分

论坛徽章:
780
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
4 [报告]
发表于 2015-12-06 15:28 |只看该作者
回复 1# tainche

  1. awk '{if($1~/(pv|nv)$/){a[++n]=$1;m=$1}else if($1~/(pt|nt)$/){b[m,$1]=$2;if(!c[$1]++)head=length(head)?head"\t"$1:$1}} END{print "\t"head;l=split(head,d,"\t");for(i=1;i<=n;i++){s=a[i];for(j=1;j<=l;j++)s=length(b[a[i],d[j]])?s"\t"b[a[i],d[j]]:s"\t0";print s}}' urfile

  2.         0190pt  0370pt  0543pt  0023nt  0036nt  0029pt  0118pt  0434pt
  3. 0553pv 823     770     769     0       0       0       0       0
  4. 0554nv  961     0       0       942     924     0       0       0
  5. 0555pv  0       0       0       0       0       901     875     842
复制代码

评分

参与人数 1信誉积分 +50 收起 理由
tainche + 50 多谢帮助

查看全部评分

论坛徽章:
0
5 [报告]
发表于 2015-12-06 15:28 |只看该作者
回复 3# songyc_2015


    多谢大神,不过在服务器上运行报错,awk: $1~/v$/{s=$1;next}{l=l?l"\t"$11;h[$1]=$2}END{split(l,t);print "\t"l;for(i in h){printf i"\t";for(j in t)printf h[t[j]]?h[t[j]]"\t":0"\t";print ""}}
awk:                                       ^ syntax error

按照楼下大神的方法已搞定,多谢

论坛徽章:
0
6 [报告]
发表于 2015-12-06 15:29 |只看该作者
回复 3# songyc_2015


    多谢大神帮忙,搞定了,膜拜中

论坛徽章:
12
IT运维版块每日发帖之星
日期:2015-11-17 06:20:00程序设计版块每日发帖之星
日期:2016-01-19 06:20:0015-16赛季CBA联赛之江苏
日期:2016-01-17 15:31:3915-16赛季CBA联赛之上海
日期:2016-01-16 15:44:3015-16赛季CBA联赛之浙江
日期:2016-01-15 20:38:1815-16赛季CBA联赛之北京
日期:2016-01-09 14:30:15CU十四周年纪念徽章
日期:2016-01-07 12:31:5115-16赛季CBA联赛之四川
日期:2016-01-01 11:49:1515-16赛季CBA联赛之深圳
日期:2015-12-24 14:23:4115-16赛季CBA联赛之山西
日期:2015-12-15 16:22:31技术图书徽章
日期:2015-12-10 17:41:0015-16赛季CBA联赛之北控
日期:2016-02-03 10:03:24
7 [报告]
发表于 2015-12-06 19:13 |只看该作者
  1. awk '$1~/v$/{a[++m]=$1;next}{b[a[m],$1]=$2;if(!c[$1]++){head=head"\t"$1;d[++n]=$1}}END{print head;for(i=1;i<=m;i++){s=a[i];for(j=1;j<=n;j++){k=b[a[i],d[j]];k=k?k:0;s=s"\t"k}print s}}'
复制代码

论坛徽章:
0
8 [报告]
发表于 2015-12-06 19:51 |只看该作者
回复 7# sync_1521

不好意思,信誉积分只剩2了,只能在此拜谢了
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP