纯sed列的复杂换位

纯sed列的复杂换位,sed,regex,pattern-matching,Sed,Regex,Pattern Matching,我花了几个小时试图为这个问题找到一个纯粹的解决方案。显然,不幸的是我没有成功。一个非常棘手的问题 示例(来自awk问题): 输入: aaa 111 AAA222 AAA333 BBB444 BBB555 CCC666 输出: aaa 111222333 BBB4455 CCC666 输入 APM00065101435 189 APM00065101435 190 APM00065101435191 APM00065101435 390 19010455500C7 19010455

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


示例(来自awk问题):

  • 输入:
aaa 111 AAA222 AAA333 BBB444 BBB555 CCC666
  • 输出:
aaa 111222333 BBB4455 CCC666
  • 输入
APM00065101435 189 APM00065101435 190 APM00065101435191 APM00065101435 390 19010455500C7 19010455500D1 19010455500E1 190104555 0454 190104555 0462 APM00065101435 391 APM00065101435 392
  • 输出
APM00065101435 189190191390 190104555 00C7,00D1,00E104540462 APM00065101435 391392
我试过什么?我的一些非工作示例:

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 sed-nr'1{h;b};Hx/(\S+).*\n\1.*\'/M{x;b};s/*\'//m;s/\n\s*\s*/,/g;s/,$/;p'文件 sed-nr'1{h;b};Hx;Hs/(\s+).*\n(\s+).*\'/\1\n\2/m/(\S+)\n\1\'/M{$!b;g;bk};Gs/\n.\'//m;:Ks/^\s+\s//2mg;s/\n/,/g;Px;s/*\n/;h$文件2 sed-nr'H;Gs/(\s+)\s.*/\1/gm/(\S+)\n\1\'/M{$!b;g;bk};G1d;s/\n.\'//m;:Ks/\n\s+\s/,/2g;s/\n/;PGs/\n.*(\n.*)$/\1/;h'文件2 感谢您阅读此文章。

这可能适合您(GNU-sed):

或者,如果您愿意:

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

这会将两行读入模式空间,比较每行的开头,如果它们相同,则用逗号替换与第一行匹配的第二行的开头并重复。如果两行不匹配,它会打印出第一行。

Ugh…这可能是可能的…但我肯定不会浪费时间去弄清楚它是否匹配!为什么需要纯sed解决方案?这个问题是awk的一个小问题…为什么要让自己的生活更艰难呢?在
awk
perl
中解决这个问题的方法将更具可读性、可维护性,并且会让你梦想独角兽!!只需为独角兽人做这件事(或等到醒来)!!非常感谢你,波彤。你又帮了我。我非常感谢你,谢谢。如果可以的话,我会给你一笔赏金! 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
sed -r ':a;$!N;s/^(([^ ]+ ).*)\n\2/\1,/;ta;P;D' file
sed -r ':a;$!N;s/^((\S+\s).*)\n\2/\1,/;ta;P;D' file