Complex column permutation with pure sed

I tried a couple of hours to find a clean sed for this question. Obviously, unfortunately, I did not succeed. This is a very difficult question.


Examples (from the awk question):

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

  • entrance
  APM00065101435 189
 APM00065101435 190
 APM00065101435 191
 APM00065101435 390
 190104555 00C7
 190104555 00D1
 190104555 00E1
 190104555 0454
 190104555 0462
 APM00065101435 391
 APM00065101435 392
  • Output
  APM00065101435 189,190,191,390
 190104555 00C7.00D1.00E1.0454.0462
 APM00065101435 391.392

What have i tried? Some of my non-working examples:

  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

Thanks for reading this.

+6
source share
1 answer

This may work for you (GNU sed):

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

or if you prefer:

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

This reads 2 lines into the pattern space, compares the beginning of each line and, if they are the same, replaces the beginning of the second line, which matches the first with a comma and repeats. If the lines do not match, the first line is printed.

+5
source

Source: https://habr.com/ru/post/948502/


All Articles