我试了几个小时才找到 纯sed this 的解决方案题。显然,不幸的是我没有成功。一个非常棘手的问题。
示例(来自 awk 问题):
第111话
第222话
第 333 章
第 444 章
第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' 文件
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
感谢您阅读本文。
最佳答案
这可能对你有用(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
这将 2 行读入模式空间,比较每行的开头,如果它们相同,则用逗号替换与第一行匹配的第二行的开头并重复。如果行不匹配,则打印出第一行。
关于regex - 使用纯 sed 对列进行复杂转置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17414805/