使用纯 sed 对列进行复杂转置 [英] complex transposing of columns with pure sed
问题描述
我尝试了几个小时来找到一个 纯 sed 这个问题的解决方案.显然,不幸的是我没有成功.一个非常棘手的问题.
示例(来自 awk 问题):
- 输入:
- 输出:
- 输入
- 输出
我尝试了什么?我的一些非工作示例:
<前>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 sed 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屋!