用纯sed复杂地转置柱子

cap*_*cha 6 regex sed pattern-matching

我试了几个小时为这个问题找到一个纯粹的解决方案.显然,遗憾的是我没有成功.一个非常棘手的问题.


例子(来自awk问题):

  • 输入:
aaa 111    
aaa 222
aaa 333
bbb 444
bbb 555
ccc 666
  • 输出:
aaa 111,222,333
bbb 444,555
ccc 666

  • 输入
APM00065101435 189
APM00065101435 190
APM00065101435 191
APM00065101435 390
190104555 00C7
190104555 00D1
190104555 00E1
190104555 0454
190104555 0462
APM00065101435 391
APM00065101435 392
  • 产量
APM00065101435 189,190,191,390
190104555 00C7,00D1,00E1,0454,0462
APM00065101435 391,392

我试过了什么?我的一些非工作示例:

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

感谢您阅读本文.

pot*_*ong 5

这可能适合你(GNU sed):

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

或者如果您愿意:

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

这将在模式空间中读取2行,比较每行的开头,如果它们相同,则用逗号替换第一行匹配第一行的开头并重复.如果线条不匹配则打印出第一行.