2016-04-11 15 views
0

Ich habe Daten, die wie dies ich die Ausgabepassenden nicht-eindeutige Werte eindeutige Werte

1 3,2,9 
    5 4,6,8,9 
    4 6,2 

Dies ist nur Beispieldaten aber meine ursprünglich viel sein möchten

1 3 
1 2 
1 9 
5 4 
4 6 
5 6 
5 8 
5 9 
4 2 

sehen hat mehr Werte.

+3

Bearbeiten Sie Ihre Frage, um zu zeigen, was Sie bisher versucht haben. Selbst wenn es sich nur um Pseudo-Code handelt, würde es sich Mühe geben, Ihr Problem zu lösen und andere zu motivieren, Ihnen zu helfen. Übrigens, damit Sie herausfinden können, welches Werkzeug Sie benötigen: grep ist zum Drucken einer Zeichenkette, die mit einer Regexp in einer Datei übereinstimmt - das ist nicht das, was Sie versuchen zu tun. sed ist für einfache Substitutionen auf einzelnen Zeilen - das ist auch nicht das, was Sie versuchen zu tun. awk ist für alle anderen Textmanipulationen - das ist was du versuchst zu tun. –

+0

Danke. Ich habe es mit awk probiert. – Paul

+0

Großartig, wieder - ** Bearbeiten Sie Ihre Frage, um zu zeigen, was Sie bisher versucht haben. **. –

Antwort

1

So arbeiteten diese

So dies im Grunde eine Hash-Tabelle erstellt, die erste Spalte als Schlüssel verwendet, und die zweite Spalte der Zeile als Wert:

awk '{line="";for (i = 2; i <= NF; i++) line = line $i ", "; table[$1]=table[$1] line;} END {for (key in table) print key " => " table[key];}' trial.txt 

OUTPUT

4 => 6, 2 
5 => 4, 6, 8, 9 
1 => 3, 2, 9 
+0

Wenn dies Ihr Versuch ist und Sie immer noch Hilfe benötigen, um die von Ihnen gewünschte Ausgabe in Ihrer Frage zu erzeugen, dann löschen Sie diese Antwort und bearbeiten Sie stattdessen Ihre Frage, um dieses Skript einzuschließen und zu erklären, warum es unzulänglich ist. Wenn Sie sagen, dass Sie eine Lösung gefunden haben, mit der Sie zufrieden sind und keine Hilfe benötigen, dann löschen Sie einfach Ihre Frage, sodass niemand sonst Zeit damit verschwendet, sie zu betrachten. –

+1

Während dieser Code die Frage beantworten kann, zusätzliche Kontext in Bezug auf _why_ und/oder _how_ es antwortet die Frage würde erheblich verbessern seine langfristigen Wert. Bitte [bearbeiten] Sie Ihre Antwort, um eine Erklärung hinzuzufügen. –

0

Ich würde schreiben

awk -v OFS=, ' 
    { 
     key = $1 
     $1 = "" 
     values[key] = values[key] $0 
    } 
    END { 
     for (key in values) { 
      sub(/^,/, "", values[key]) 
      print key " " values[key] 
     } 
    } 
' file 

Wenn Sie nur die eindeutigen Werte für jeden Schlüssel (erfordert GNU awk für mehrdimensionale Arrays)

gawk -v OFS=, ' 
    { for (i=2; i<=NF; i++) values[$1][$i] = i } 
    END { 
     for (key in values) { 
      printf "%s ", key 
      sep = "" 
      for (val in values[key]) { 
       printf "%s%s", sep, val 
       sep = "," 
      } 
      print "" 
     } 
    } 
' file 

oder Perl

perl -lane ' 
    $key = shift @F; 
    $values{$key}{$_} = 1 for @F; 
} END { 
    $, = " "; 
    print $_, join(",", keys %{$values{$_}}) for keys %values; 
' file 
0

wenn nicht mit der Reihenfolge der Schlüssel besorgt, ich glaube, Dies ist die idiomatische awk Lösung.

$ awk '{a[$1]=($1 in a?a[$1]",":"") $2} 
    END{for(k in a) print k,a[k]}' file | 
column -t 

4 6,2 
5 4,6,8,9 
1 3,2,9 
Verwandte Themen