我试图按顺序按元素名称连接此表:
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列连接字符串。为什么?
答案 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;。由您决定如何以您想要的形式输出数据。