免费注册 查看新帖 |

Chinaunix

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

求助,一个矩阵变换的问题!~ [复制链接]

论坛徽章:
0
发表于 2016-05-13 04:57 |显示全部楼层
首先献给大神们膝盖!~!涌泉相报~!

输入是这样:

ID1    ID2    a    b    c    d   ...
A     M       1    2    1    5
A     N       2    1    5    6
B     M       1    3    2    2
B     M       1    5    1    6
B     N       1    5    1    1
C     N       1    5    1    6
.
.
.


输出:

ID   a    A
M    1
N    2
ID   a    B
M    1
M    1
N    1
ID   a    C
N    1
.
.
.
ID   b    A
M    2
N    1
ID   b    B
M    3
M    5
N    5
ID   b    C
N    5

.
.
.

ID   c    A
M    1
N    5
ID   c    B
M    2
M    1
N    1
ID   c    C
N    1
.
.
.


ID   d    A
M    5
N    6
ID   d    B
M    2
M    6
N    1
ID   d    C
N    6
.
.
.



请各位帮忙~!~~~再次感谢~!

论坛徽章:
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-05-13 10:02 |显示全部楼层
回复 1# xiayuu119
你试下,
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my %hStat;
  5. my @aHeader = grep {!m/\AI/} split ' ', scalar <DATA>;
  6. map {push (@{$hStat{$_->[0]}}, $_)} map {[split]} <DATA>;
  7. my $sOffset = 2;
  8. foreach my $sVal (@aHeader){
  9.     foreach my $sKey (sort keys %hStat){
  10.         my @aData = @{$hStat{$sKey}};
  11.         my $raFirst = splice (@aData, 0, 1);
  12.         print "ID $sVal $raFirst->[0]\n";
  13.         print "@$raFirst[1, $sOffset]\n";
  14.         print "@{$_}[1, $sOffset]\n" for @aData;
  15.     }
  16.     $sOffset++;
  17. }

  18. __DATA__
  19. ID1    ID2    a    b    c    d
  20. A     M       1    2    1    5
  21. A     N       2    1    5    6
  22. B     M       1    3    2    2
  23. B     M       1    5    1    6
  24. B     N       1    5    1    1
  25. C     N       1    5    1    6
复制代码

论坛徽章:
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-05-13 10:03 |显示全部楼层
回复 1# xiayuu119

写完,才发现这是Perl板,自行改写就可以了..

$ awk '{for(n=3;n<=NF;++n){if(NR>1){if(!b[$1]++)b[++c]=$1;d[a[n],$1]=d[a[n],$1]$2" "$n"\n"}else a[n]=$n}}END{for(n=3;n<=NF;++n)for(m=1;m<=c;++m)printf("ID %s %s\n%s",a[n],b[m],d[a[n],b[m]])}' FILE
ID a A
M 1
N 2
ID a B
M 1
M 1
N 1
ID a C
N 1
ID b A
M 2
N 1
ID b B
M 3
M 5
N 5
ID b C
N 5
ID c A
M 1
N 5
ID c B
M 2
M 1
N 1
ID c C
N 1
ID d A
M 5
N 6
ID d B
M 2
M 6
N 1
ID d C
N 6

   

评分

参与人数 2信誉积分 +20 收起 理由
xiayuu119 + 10 神马都是浮云,太感谢了!简洁漂亮~!~my g.
sunzhiguolu + 10 神马都是浮云

查看全部评分

论坛徽章:
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-05-13 10:05 |显示全部楼层
输出结果:
------------------------------------------------------
ID a A
M 1
N 2
ID a B
M 1
M 1
N 1
ID a C
N 1
ID b A
M 2
N 1
ID b B
M 3
M 5
N 5
ID b C
N 5
ID c A
M 1
N 5
ID c B
M 2
M 1
N 1
ID c C
N 1
ID d A
M 5
N 6
ID d B
M 2
M 6
N 1
ID d C
N 6

论坛徽章:
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-05-13 10:17 |显示全部楼层
回复 3# jason680
大神, 能向您提个请求吗? (关于代码的)

   

论坛徽章:
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-05-13 10:22 |显示全部楼层
回复 5# sunzhiguolu

本帖有关则直接发问(不必发两次...)
若与本帖无关,请发“消息”...
   

论坛徽章:
6
15-16赛季CBA联赛之新疆
日期:2016-03-22 22:34:5915-16赛季CBA联赛之山东
日期:2016-04-11 09:08:41程序设计版块每日发帖之星
日期:2016-06-28 06:20:00程序设计版块每日发帖之星
日期:2016-07-19 06:20:00每日论坛发贴之星
日期:2016-07-19 06:20:0015-16赛季CBA联赛之青岛
日期:2016-07-20 22:44:17
发表于 2016-05-13 12:16 |显示全部楼层
本帖最后由 RE_HASH 于 2016-05-13 12:17 编辑

$> perl -nae 'unless(@Hdr){@Hdr = @F}else{for my $i (2 .. $#F ){$O[$i] .= sprintf "%s$F[1] $F[$i]\n",($F[0] ne $Prev)?"ID $Hdr[$i] $F[0]\n":""} $Prev=$F[0]} END{print @O}' file
ID a A
M 1
N 2
ID a B
M 1
M 1
N 1
ID a C
N 1
ID b A
M 2
N 1
ID b B
M 3
M 5
N 5
ID b C
N 5
ID c A
M 1
N 5
ID c B
M 2
M 1
N 1
ID c C
N 1
ID d A
M 5
N 6
ID d B
M 2
M 6
N 1
ID d C
N 6

评分

参与人数 1信誉积分 +10 收起 理由
sunzhiguolu + 10 您这个思路太赞了!!!

查看全部评分

论坛徽章:
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-05-13 12:52 |显示全部楼层
向两位大神学习, 都太厉害了!!!

论坛徽章:
0
发表于 2016-05-14 02:29 |显示全部楼层
向三位前辈学习!~~~太厉害了~!!~!再次感谢~!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP