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

use sed to change a text report to csv

我有一份报告如下:

par_a
    .xx
    .yy
par_b
    .zz
    .tt

我希望使用 sed 1 liner 将此格式转换为 csv 格式,如下所示:

par_a,.xx
par_a,.yy
par_b,.zz
par_b,.tt

请帮忙。

使用 sed:

sed '/^par_/ { h; d; }; G; s/^[[:space:]]*//; s/\(.*\)\n\(.*\)/,/' 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\(.*\)/,/ # rearrange to desired CSV format

根据您的实际输入数据,您可能希望将 /^par_/ 替换为 /^[^[:space:]]/。它必须是识别段落起始行的模式。

附录: 使用 space 模式识别段落时避免正则表达式重复的较短版本:

sed -r '/^\s+/! { h; d; }; s///; G; s/(.*)\n(.*)/,/' filename

或者,如果您必须使用 BSD sed(Mac OS X 附带):

sed '/^[[:space:]]\{1,\}/! { h; d; }; s///; G; s/\(.*\)\n\(.*\)/,/' filename

后者应该可移植到所有 seds,但如您所见,编写可移植 sed 会带来一些痛苦。

awk:

awk '/^par_/{v=[=10=];next}/^ /{[=10=]=v",";print}' File

或者让它更通用:

awk '/^[^[:blank:]]/{v=[=11=];next} /^[[:blank:]]/{[=11=]=v",";print}' File

当一行以par_开头时,将内容保存到变量v。现在,当一行以 space 开头时,将行更改为 v 后跟 , 后跟 first field.

的内容

输出:

AMD$ awk '/^par_/{v=[=12=]}/^ /{[=12=]=v",";print}' File
par_a,.xx
par_a,.yy
par_b,.zz
par_b,.tt