使用sed、awk或其他工具从Linux命令行中的文本文件生成csv

使用sed、awk或其他工具从Linux命令行中的文本文件生成csv,awk,sed,csh,Awk,Sed,Csh,我有一个包含数千行的文件,我希望将其作为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 c

我有一个包含数千行的文件,我希望将其作为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
因此,现在所有内容都只在一行中,“\”字符已被删除

请注意,每行的开头可能有空格,因此在执行其他操作之前,应先修剪这些空格

你知道如何做到这一点吗

提前谢谢

致以最良好的祝愿,
Pedro

使用sed的一些更模糊的功能(它可以做的不仅仅是
s//
):

基本上:

  • 在模式空间中读入一行

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

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

  • 打印结果,然后用新行返回到开头


    • 使用sed的一些更模糊的功能(它可以做的不仅仅是
      s//
      ):

      基本上:

      • 在模式空间中读入一行

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

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

      • 打印结果,然后用新行返回到开头


        • OP已经接受了@Shawn的答案,我不确定 如果我的答案是值得张贴,但请允许我这样做只是为了信息。 如果您选择
          Perl
          ,请尝试以下保留 括号内的空格不替换为逗号:

          perl -0777 -ne '
              s/\\\n//g;
              foreach $line (split(/\n/)) {
                  while ($line =~ /(\([^)]+\))|(\S+)/g) {
                      push(@ary, $&);
                  }
                  print join(",", @ary), "\n";
                  @ary = ();
              }
          ' input.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
          
          [如何工作]

          • 首先,
            -0777-ne
            选项告诉
            Perl
            去读所有的行 输入到Perl的默认变量
            $\uu
          • 下一步,
            s/\\\n//g通过合并行删除尾部反斜杠
          • 然后
            拆分(/\n/)
            再次拆分换行符上的行
          • 正则表达式
            /(\([^)]+\)|(\S+)/g
            将是最重要的部分 它将每行划分为字段。字段模式定义为:
            “由paren或不包含空格的子字符串包围的子字符串。”
            它在
            awk
            中充当
            FPAT
            ,并保留空格 在巴黎人之间不分界线
          我已经用大约10000行输入和执行时间进行了测试 不到一秒钟。

          希望这有帮助。

          OP已经接受了@Shawn的答案,我不确定 如果我的答案是值得张贴,但请允许我这样做只是为了信息。 如果您选择
          Perl
          ,请尝试以下保留 括号内的空格不替换为逗号:

          perl -0777 -ne '
              s/\\\n//g;
              foreach $line (split(/\n/)) {
                  while ($line =~ /(\([^)]+\))|(\S+)/g) {
                      push(@ary, $&);
                  }
                  print join(",", @ary), "\n";
                  @ary = ();
              }
          ' input.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
          
          [如何工作]

          • 首先,
            -0777-ne
            选项告诉
            Perl
            去读所有的行 输入到Perl的默认变量
            $\uu
          • 下一步,
            s/\\\n//g通过合并行删除尾部反斜杠
          • 然后
            拆分(/\n/)
            再次拆分换行符上的行
          • 正则表达式
            /(\([^)]+\)|(\S+)/g
            将是最重要的部分 它将每行划分为字段。字段模式定义为:
            “由paren或不包含空格的子字符串包围的子字符串。”
            它在
            awk
            中充当
            FPAT
            ,并保留空格 在巴黎人之间不分界线
          我已经用大约10000行输入和执行时间进行了测试 不到一秒钟。

          希望这有帮助。

          非常感谢。在接下来的10年里,我不会明白这一点。:-)恐怕结果中包含了不需要的逗号。@tshiono我没有注意到这些。不幸的是,在一个本身是空间分隔的区域中间的空间很难处理,非常感谢。在接下来的10年里,我不会明白这一点。:-)恐怕结果中包含了不需要的逗号。@tshiono我没有注意到这些。不幸的是,在一个本身是空间分隔的区域中间的空间要处理起来要困难得多。