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

Awk 将几行合并为一行,直到找到特殊行,awk,sed,Awk,Sed,我有一个以下格式的文本文件。下面的几行随机数后面有一个分隔符(******) aa bb cc ***** dd ee ***** ff ggg hh ii ***** 我期待着像下面这样的输出 aa,bb,cc dd,ee ff,ggg,hh,ii 我认为awk和sed可以帮助我。但无法计算 完全正确。 如何将这些行合并为一行 谢谢。此awk单行程序适用于您的输入: awk -v RS='[*]+' -v OFS="," '$1=$1' file 使用您的数据进行测试: kent$ c

我有一个以下格式的文本文件。下面的几行随机数后面有一个分隔符(
******

aa
bb
cc
*****
dd
ee
*****
ff
ggg
hh
ii
*****
我期待着像下面这样的输出

aa,bb,cc
dd,ee
ff,ggg,hh,ii
我认为awk和sed可以帮助我。但无法计算 完全正确。 如何将这些行合并为一行


谢谢。

此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

像这样的怎么样:

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

nice
awk
解决方案的替代方案,如果您的
sed
支持“\n”

$ tr '\n' ',' <file | sed 's/,\**,/\n/g'
$tr'\n'','这可能适合您(GNU-sed):

将另一行附加到当前行,然后用逗号替换其换行符,直到遇到仅由
*
组成的行。然后打印第一行并删除图案空间。

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

awk
sed
到底有什么问题?你试过什么?
aa,bb,cc
dd,ee
ff,ggg,hh,ii