2013-07-01 2 views
6

Ich habe ein paar Stunden versucht, eine pure Lösung für this Frage zu finden. Offensichtlich hatte ich leider keinen Erfolg. Eine wirklich knifflige Frage. komplexe Transponierung von Spalten mit reinen Sed


Beispiele (von der awk Frage):

  • input:
 
aaa 111  
aaa 222 
aaa 333 
bbb 444 
bbb 555 
ccc 666 
  • output:
 
aaa 111,222,333 
bbb 444,555 
ccc 666 

  • Eingang
 
APM00065101435 189 
APM00065101435 190 
APM00065101435 191 
APM00065101435 390 
190104555 00C7 
190104555 00D1 
190104555 00E1 
190104555 0454 
190104555 0462 
APM00065101435 391 
APM00065101435 392 
  • Ausgang
 
APM00065101435 189,190,191,390 
190104555 00C7,00D1,00E1,0454,0462 
APM00065101435 391,392 

Was haben versucht, ich? Einige meiner nicht Arbeitsbeispiele:

 
sed -nr '1{h;b};H;x;/(\S+).*\n\1.*\'/M{x;b};s/.*\'//m;s/\n\S*\s*/,/g;s/,$//;p' file 
sed -nr '1{h;b};H;x;h;s/(\S+).*\n(\S+).*\'/\1\n\2/m;/(\S+)\n\1\'/M{$!b;g;bk};g;s/\n.*\'//m;:k;s/^\S+\s//2mg;s/\n/,/g;p;x;s/.*\n//;h;$l' file2 
sed -nr 'H;g;s/(\S+)\s.*/\1/gm;/(\S+)\n\1\'/M{$!b;g;bk};g;1d;s/\n.*\'//m;:k;s/\n\S+\s/,/2g;s/\n//;p;g;s/\n.*(\n.*)$/\1/;h' file2 

Vielen Dank für diese zu lesen.

+0

Ugh ... das * könnte * möglich sein ... aber ich werde sicherlich nicht versuchen, meine Zeit damit zu verschwenden, herauszufinden, ob es ist oder nicht! Warum willst du eine reine Sed-Lösung? Dieses Problem ist ein Kinderspiel für awk ... warum machen Sie das Leben härter auf sich selbst? –

+0

Eine Lösung dafür in 'awk' oder' perl' wird lesbarer, wartbarer und lässt dich von Einhörnern träumen !! Mach es einfach für einen Einhornmann (oder warte, bis [potong] (http://stackoverflow.com/users/967492/potong) aufwacht) !! –

Antwort

5

Dies könnte für Sie arbeiten (GNU sed):

sed -r ':a;$!N;s/^(([^ ]+).*)\n\2/\1,/;ta;P;D' file 

oder wenn Sie es vorziehen:

sed -r ':a;$!N;s/^((\S+\s).*)\n\2/\1,/;ta;P;D' file 

Dieses liest 2 Zeilen in den Musterraum, vergleicht den Anfang jeder Zeile und wenn sie gleich sind, wird der Anfang der zweiten Zeile, die mit dem ersten übereinstimmt, durch ein Komma ersetzt und wiederholt. Wenn die Zeilen nicht übereinstimmen, wird die erste Zeile gedruckt.

+0

Vielen Dank, Potong. Du hast mir wieder geholfen. Ich bin Ihnen sehr dankbar, danke. Ich würde dir eine Prämie zahlen, wenn ich könnte! – captcha