2017-05-08 5 views
-2

ich triying durch den Elementnamen dieser Tabelle concantenate in Folge:Wie Gruppenelemente in Folge einer bestimmten Spalte

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) 

ich diesen Befehl verwendet:

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

und erhalten:

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 

Aber ich erwartet dies:

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 

Mein Befehl verkettet die Zeichenfolge basierend auf Spalte 2 nicht. Warum?

+3

Sie sollten wahrscheinlich ein vollständiges Ruby-Programm anstelle eines Einzeiler-Snippets posten. Niemand wird sich die Zeit nehmen, herauszufinden, was Ihr Einzeiler macht. –

+0

Ich benutze oneliner für Zeit sparen Code schreiben – zzero

+2

Bitte, bitte, bitte. ** BEENDEN SIE DIE VERWENDUNG VON EINZELNEN **. Das spart keine Zeit, weil ich sehe, dass du immer wieder mit Fragen zu ihnen kommst. Wenn du die fünf Minuten genommen hättest, um dies in eine richtig organisierte Ruby-Datei zu bringen, wären Fehler offensichtlicher und daher reparierbarer. Dieser Code ist ein Albtraum, mit dem man arbeiten kann. Es ist ein Alptraum, dir zu helfen. Es gibt buchstäblich keinen Grund, dies zu tun. – tadman

Antwort

1

Dies sollte Ihnen den Einstieg:

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) 

Das Heben schwerer Lasten von group_by erfolgt. Natürlich gibt es andere Möglichkeiten, es zu tun, aber group_by ist eine gute Lösung, wenn Sie "Daten um einen Wert gruppieren" möchten. Es liegt an Ihnen, herauszufinden, wie Sie die Daten in der von Ihnen gewünschten Form ausgeben.

+0

Vielen Dank für Ihre Hilfe bei dieser Frage – zzero

+1

Es ist wichtig, Code in einer normalen Form zu skizzieren, bevor Sie versuchen, es zu einem "einzeiligen" zu konvertieren. Einzeilige Befehlszeilen sind nicht so nützlich, da Ruby ein Skript problemlos als Teil einer Pipeline behandeln kann. Sie können sehr komplexe Aufgaben in einem normalen Skript ausführen, aber immer noch als Teil einer Befehlskette aufrufen. Lesen Sie über ARGF und OptionParser. –

Verwandte Themen