【问题标题】:complex transposing of columns with pure sed使用纯 sed 对列进行复杂转置
【发布时间】:2013-06-29 04:25:13
【问题描述】:

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


示例(来自 awk 问题):

  • 输入:
AA 111 222 333 bbb 444 bbb 555 ccc 666
  • 输出:
AA 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' 文件 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' 文件2 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' 文件2

感谢您阅读本文。

【问题讨论】:

  • 呃......这可能是可能的......但我当然不会试图浪费我的时间来弄清楚它是否是!为什么要纯 sed 解决方案?这个问题对 awk 来说是小菜一碟……为什么要让自己过得更艰难?
  • awkperl 中的解决方案将更具可读性、可维护性,并且会让您梦想独角兽!只为独角兽人做(或等到potong醒来)!!

标签: sed regex sed pattern-matching


【解决方案1】:

这可能对你有用(GNU sed):

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

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

【讨论】:

  • 非常感谢您,波东。你又帮了我。我非常感谢你,谢谢。如果可以的话,我会给你赏金!
猜你喜欢
  • 2010-11-15
  • 1970-01-01
  • 2010-10-07
  • 2020-10-29
  • 2019-05-03
  • 1970-01-01
  • 1970-01-01
  • 2017-08-05
  • 1970-01-01
相关资源
最近更新 更多