首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用sed、awk或其他命令行从Linux命令行中的文本文件生成csv

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

Stack Overflow用户
提问于 2019-05-23 03:21:09
回答 2查看 57关注 0票数 0

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

原始文件如下所示:

代码语言:javascript
复制
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格式应为:

代码语言:javascript
复制
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

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

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

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

提前谢谢。

致以最好的问候,佩德罗

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-23 06:55:38

使用sed的一些比较模糊的特性(它可以做比s///更多的事情):

代码语言:javascript
复制
$ 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

基本上:

如果模式空间以space.

  • :line /\\$/ {s/\\$//; N; b line}:结尾,则
  • 将一行读入模式空间,删除反斜杠,读取下一行并将其附加到模式空间,然后重复此step.
  • s/[[:space:]]+/,/g:将每个包含1个或多个空格字符的情况转换为单个逗号。
  • 打印结果,然后返回到新行的开头。
票数 1
EN

Stack Overflow用户

发布于 2019-05-24 07:24:16

@Shawn的答案已经被OP接受了,我不确定我的答案是否值得发布,但允许我这样做只是为了提供信息。如果您选择Perl,请尝试以下脚本,该脚本保留括号中的空格,而不是用逗号替换它们:

代码语言:javascript
复制
perl -0777 -ne '
    s/\\\n//g;
    foreach $line (split(/\n/)) {
        while ($line =~ /(\([^)]+\))|(\S+)/g) {
            push(@ary, $&);
        }
        print join(",", @ary), "\n";
        @ary = ();
    }
' input.txt

输出:

代码语言:javascript
复制
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

如何工作

$_.

  • Next,

  • 首先,-0777 -ne选项告诉Perl将所有行合并到Perl的默认变量中。s/\\\n//g;通过合并行删除尾随的反斜杠。

  • 然后split(/\n/)再次将换行符上的行拆分回来。

  • 正则表达式/(\([^)]+\))|(\S+)/g将是将每行划分为字段的最重要部分。字段模式定义为:"substring surrounded by parens OR substring which does not include whitespaces."它在awk中作为FPAT工作,并保留括号之间的空格,而不分割其中的行。

我已经测试过了。10,000行输入,执行时间不到一秒。

希望这能有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56263613

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档