2013-07-01 17 views
6

Ho provato un paio d'ore a trovare una soluzione pura per la domanda this. Ovviamente, sfortunatamente non ci sono riuscito. Una domanda davvero difficile. trasposizione complessa di colonne con sed puri


Esempi (dalla domanda awk):

  • ingresso:
 
aaa 111  
aaa 222 
aaa 333 
bbb 444 
bbb 555 
ccc 666 
  • uscita:
 
aaa 111,222,333 
bbb 444,555 
ccc 666 

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

Cosa ho provato? Alcuni dei miei esempi non funzionanti:

 
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 

Grazie per la lettura di questo.

+0

Ugh ... questo * potrebbe * essere possibile ... ma certamente non cercherò di sprecare il mio tempo a capire se lo è o no! Perché vuoi una soluzione pura sed? Questo problema è un gioco da ragazzi per awk ... perché rendere la vita più difficile con te stesso? –

+0

Una soluzione per questo in 'awk' o' perl' sarà più leggibile, manutenibile e ti farà sognare unicorni !! Fallo per unicorno (o aspetta fino a quando [potong] (http://stackoverflow.com/users/967492/potong) si sveglia) !! –

risposta

5

Questo potrebbe funzionare per voi (GNU sed):

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

o se si preferisce:

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

Questa legge 2 linee nello spazio modello, mette a confronto l'inizio di ogni riga e se sono uguali sostituisce l'inizio della seconda riga che corrisponde alla prima con una virgola e si ripete. Se le linee non corrispondono, stampa la prima riga.

+0

Grazie mille, potong. Mi hai aiutato di nuovo. Ti sono molto grato, grazie. Ti pagherei una taglia se potessi! – captcha

Problemi correlati