首页 > 解决方案 > 使用 sed、awk 或其他在 Linux 命令行中从文本文件生成 csv

问题描述

我有一个包含数千行的文件,我想将其作为 csv 文件,以供以后处理。

原始文件如下所示:

cc_1527 (ILDO_I173_net9 VSSA) capacitor_mis c=9.60713e-16
cc_1526 (VDD_MAIN Istartupcomp_I115_G7) capacitor_mis \
    c=4.18106e-16
cc_1525 (VDD_MAIN Istartupcomp_I7_net025) capacitor_mis \
    c=9.71462e-16
cc_1524 (VDD_MAIN Istartupcomp_I7_ST_net14) \
    capacitor_mis c=4.6011e-17
cc_1523 (VDD_MAIN Istartupcomp_I7_ST_net15) \
    capacitor_mis c=1.06215e-15
cc_1522 (VDD_MAIN ILDO_LDO_core_Istartupcomp_I7_ST_net16) \
    capacitor_mis c=1.37289e-15
cc_1521 (VDD_MAIN ILDO_LDO_core_Istartupcomp_I7_I176_G4) capacitor_mis \
    c=6.81758e-16

这里的问题是,有些行继续到下一行,用符号“\”表示。

原始文本前 5 行的最终 csv 格式应为:

cc_1527,(ILDO_I173_net9 VSSA),capacitor_mis c=9.60713e-16
cc_1526,(VDD_MAIN Istartupcomp_I115_G7),capacitor_mis,c=4.18106e-16
cc_1525,(VDD_MAIN Istartupcomp_I7_net025),capacitor_mis,c=9.71462e-16

因此,现在所有内容都在一行中,并且“\”字符已被删除。

请注意,每行的开头可能存在空格,因此应在完成任何其他操作之前修剪这些空格。

关于如何实现这一点的任何想法。?

提前致谢。

最好的问候,佩德罗

标签: awksedcsh

解决方案


使用 sed 的一些比较晦涩的特性(它可以做的不止s///):

$ sed -E ':line /\\$/ {s/\\$//; N; b line}; s/[[:space:]]+/,/g' demo.txt
cc_1527,(ILDO_I173_net9,VSSA),capacitor_mis,c=9.60713e-16
cc_1526,(VDD_MAIN,Istartupcomp_I115_G7),capacitor_mis,c=4.18106e-16
cc_1525,(VDD_MAIN,Istartupcomp_I7_net025),capacitor_mis,c=9.71462e-16
cc_1524,(VDD_MAIN,Istartupcomp_I7_ST_net14),capacitor_mis,c=4.6011e-17
cc_1523,(VDD_MAIN,Istartupcomp_I7_ST_net15),capacitor_mis,c=1.06215e-15
cc_1522,(VDD_MAIN,ILDO_LDO_core_Istartupcomp_I7_ST_net16),capacitor_mis,c=1.37289e-15
cc_1521,(VDD_MAIN,ILDO_LDO_core_Istartupcomp_I7_I176_G4),capacitor_mis,c=6.81758e-16

基本上:

  • 将一行读入模式空间。

  • :line /\\$/ {s/\\$//; N; b line}:如果模式空间以 a 结尾\,请删除该反斜杠,读取下一行并将其附加到模式空间,然后重复此步骤。

  • s/[[:space:]]+/,/g: 将 1 个或多个空格字符的每个大小写转换为单个逗号。

  • 打印结果,然后换行回到开头。


推荐阅读