将几行合并为一直到找到特殊行

时间:2015-12-25 21:05:14

标签: awk sed

我有一个文本文件,格式如下。在几条随机线之后有一个分隔符(*****),如下所示

aa
bb
cc
*****
dd
ee
*****
ff
ggg
hh
ii
*****

我期待如下ouput

aa,bb,cc
dd,ee
ff,ggg,hh,ii

我认为awk和sed可以帮助我。但无法想象 它确切地说。 如何将这些行合并为一个?

谢谢。

5 个答案:

答案 0 :(得分:1)

这个awk单行应该适用于您的输入:

awk -v RS='[*]+' -v OFS="," '$1=$1' file

使用您的数据进行测试:

kent$  cat f
aa
bb
cc
*****
dd
ee
*****
ff
ggg
hh
ii
*****

kent$  awk -v RS='[*]+' -v OFS="," '$1=$1' f
aa,bb,cc
dd,ee
ff,ggg,hh,ii

答案 1 :(得分:1)

如果您的$('a',sidebar).click(function(e){ e.stopPropagation(); }); 支持`\ n'

,则可以使用

替代好awk解决方案

sed

答案 2 :(得分:0)

这样的事情怎么样:

cat in.txt | tr ' ' ',' | tr '\n' ' ' | sed 's/\*\*\*\*\*/\n/' | sed 's/^ //'

将导致:

aa,bb,cc dd,ee ff,ggg,hh,ii 
ff,ggg,hh,ii dd,ee aa,bb,cc
输入行

aa bb cc
dd ee
ff ggg hh ii
*****
ff ggg hh ii
dd ee
aa bb cc

答案 3 :(得分:0)

这可能适合你(GNU sed):

sed -r ':a;N;/\n\*+$/!s/\n/,/;ta;P;d' file

将另一行添加到当前行,然后用逗号替换其换行符,直到遇到仅包含*的行。然后打印第一行并删除模式空间。

答案 4 :(得分:0)

sed in action

sed  -nr '/^[*]+ */!{H};/^[*]+ */{s/.*//g;x;s/\n/,/g;s/^,//g;p}' my_file

输出

aa,bb,cc
dd,ee
ff,ggg,hh,ii
相关问题