使用纯 sed 对列进行复杂转置 [英] complex transposing of columns with pure sed

查看:50
本文介绍了使用纯 sed 对列进行复杂转置的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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


示例(来自 awk 问题):

  • 输入:
<前>第111话第222话第 333 章第 444 章第555话ccc 666

  • 输出:
<前>aaa 111,222,333bbb 444,555ccc 666


  • 输入
<前>APM00065101435 189APM00065101435 190APM00065101435 191APM00065101435 390190104555 00C7190104555 00D1190104555 00E1190104555 0454190104555 0462APM00065101435 391APM00065101435 392

  • 输出
<前>APM00065101435 189,190,191,390190104555 00C7,00D1,00E1,0454,0462APM00065101435 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' file2sed -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

感谢您阅读本文.

解决方案

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

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

或者如果您愿意:

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

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

I tried a couple of hours to find a pure solution for this question. Obviously, unfortunately I had not succeed. A really tricky 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


  • input

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.

解决方案

This might 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 that matches the first with a comma and repeats. If the lines do not match it prints out the first line.

这篇关于使用纯 sed 对列进行复杂转置的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆