使用 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
我有一份报告如下:
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