我的报告如下:
par_a
.xx
.yy
par_b
.zz
.tt
我希望使用sed 1 liner:
将此格式转换为csv格式,如下所示par_a,.xx
par_a,.yy
par_b,.zz
par_b,.tt
请帮忙。
答案 0 :(得分:4)
使用sed:
sed '/^par_/ { h; d; }; G; s/^[[:space:]]*//; s/\(.*\)\n\(.*\)/\2,\1/' filename
其工作原理如下:
/^par_/ { # if a new paragraph begins
h # remember it
d # but don't print anything yet
}
# otherwise:
G # fetch the remembered paragraph line to the pattern space
s/^[[:space:]]*// # remove leading whitespace
s/\(.*\)\n\(.*\)/\2,\1/ # rearrange to desired CSV format
根据您的实际输入数据,您可能希望将/^par_/
替换为/^[^[:space:]]/
。它只需要是一个识别段落起始行的模式。
附录:使用空格模式识别段落时避免正则表达式重复的较短版本:
sed -r '/^\s+/! { h; d; }; s///; G; s/(.*)\n(.*)/\2,\1/' filename
或者,如果你必须使用BSD sed(与Mac OS X一起提供):
sed '/^[[:space:]]\{1,\}/! { h; d; }; s///; G; s/\(.*\)\n\(.*\)/\2,\1/' filename
后者应该可以移植到所有的seds,但正如你所看到的,编写便携式sed会带来一些痛苦。
答案 1 :(得分:4)
使用awk:
awk '/^par_/{v=$0;next}/^ /{$0=v","$1;print}' File
或者使其更通用:
awk '/^[^[:blank:]]/{v=$0;next} /^[[:blank:]]/{$0=v","$1;print}' File
当一行以par_
开头时,请将内容保存到变量v
。现在,当一行以space
开头时,将该行更改为v
的内容,然后是,
,然后是first field
。
<强>输出:强>
AMD$ awk '/^par_/{v=$0}/^ /{$0=v","$1;print}' File
par_a,.xx
par_a,.yy
par_b,.zz
par_b,.tt