如何使用特定列按顺序对元素进行分组

时间:2017-05-08 17:47:15

标签: ruby

我试图按顺序按元素名称连接此表:

6x3+3+1;2x1+1+1;srgb(255,170,170)
1x8+1+2;2x1+1+1;srgb(255,170,170)
1x1+1+0;2x1+1+1;srgb(255,170,170)
6x3+3+1;1x2+8+4;srgb(255,170,170)
1x2+7+5;1x2+8+4;srgb(255,170,170)
4x4+6+8;1x2+6+6;srgb(255,170,170)
3x1+3+6;1x2+6+6;srgb(255,170,170)
1x2+7+5;1x2+6+6;srgb(255,170,170)
1x1+1+0;1x1+0+0;srgb(255,170,170)
1x8+1+2;1x1+2+6;srgb(255,170,170)
3x1+3+6;1x1+2+6;srgb(255,170,170)
1x8+1+2;1x1+1+10;srgb(255,170,170)
1x1+1+11;1x1+1+10;srgb(255,170,170)
1x1+1+11;1x1+0+11;srgb(255,170,170)
1x1+1+11;1x1+2+11;srgb(255,170,170)
4x4+6+8;1x1+10+11;srgb(255,170,170)

我使用了这个命令:

  ruby -a -F';' -ne   '   sum= {};sum[$F[1]] ||= ""  ;  sum[$F[1]]  =  $F[0] +   sum[$F[1]];  puts sum[$F[1]]     '   ZmGHmmzb

并获得:

6x3+3+1
1x8+1+2
1x1+1+0
6x3+3+1
1x2+7+5
4x4+6+8
3x1+3+6
1x2+7+5
1x1+1+0
1x8+1+2
3x1+3+6
1x8+1+2
1x1+1+11
1x1+1+11
1x1+1+11
4x4+6+8

但我期待这个:

6x3+3+1 1x8+1+2 1x1+1+0
6x3+3+1 1x2+7+5
4x4+6+8 3x1+3+6 1x2+7+5
1x1+1+0
1x8+1+2 3x1+3+6
1x8+1+2 1x1+1+11
1x1+1+11 1x1+1+11 4x4+6+8

我的命令没有根据第2列连接字符串。为什么?

1 个答案:

答案 0 :(得分:1)

这应该让你开始:

data = DATA.readlines.map { |l| l.split(';')[0, 2] }

data.group_by { |l| l[1] }.values.map { |a| a.map(&:first) }
# => [["6x3+3+1", "1x8+1+2", "1x1+1+0"],
#     ["6x3+3+1", "1x2+7+5"],
#     ["4x4+6+8", "3x1+3+6", "1x2+7+5"],
#     ["1x1+1+0"],
#     ["1x8+1+2", "3x1+3+6"],
#     ["1x8+1+2", "1x1+1+11"],
#     ["1x1+1+11"],
#     ["1x1+1+11"],
#     ["4x4+6+8"]]

__END__
6x3+3+1;2x1+1+1;srgb(255,170,170)
1x8+1+2;2x1+1+1;srgb(255,170,170)
1x1+1+0;2x1+1+1;srgb(255,170,170)
6x3+3+1;1x2+8+4;srgb(255,170,170)
1x2+7+5;1x2+8+4;srgb(255,170,170)
4x4+6+8;1x2+6+6;srgb(255,170,170)
3x1+3+6;1x2+6+6;srgb(255,170,170)
1x2+7+5;1x2+6+6;srgb(255,170,170)
1x1+1+0;1x1+0+0;srgb(255,170,170)
1x8+1+2;1x1+2+6;srgb(255,170,170)
3x1+3+6;1x1+2+6;srgb(255,170,170)
1x8+1+2;1x1+1+10;srgb(255,170,170)
1x1+1+11;1x1+1+10;srgb(255,170,170)
1x1+1+11;1x1+0+11;srgb(255,170,170)
1x1+1+11;1x1+2+11;srgb(255,170,170)
4x4+6+8;1x1+10+11;srgb(255,170,170)

繁重的工作由group_by完成。显然还有其他方法可以做到这一点,但group_by是一个很好的选择,当你想要按照某种价值对数据进行分组时#34;。由您决定如何以您想要的形式输出数据。