使用sed将文本报告更改为csv

时间:2015-04-08 09:26:13

标签: sed

我的报告如下:

par_a
    .xx
    .yy
par_b
    .zz
    .tt

我希望使用sed 1 liner:

将此格式转换为csv格式,如下所示
par_a,.xx
par_a,.yy
par_b,.zz
par_b,.tt

请帮忙。

2 个答案:

答案 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