我有一个包含数千行的文件,我希望将其作为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
因此,现在所有内容都只在一行中,并且"\“字符已被删除。
请注意,每一行的开头可能存在空格,因此应该在执行其他操作之前修剪这些空格。
任何关于如何实现这一点的想法。?
提前谢谢。
致以最好的问候,佩德罗
发布于 2019-05-23 06:55:38
使用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
基本上:
如果模式空间以space.
:line /\\$/ {s/\\$//; N; b line}
:结尾,则s/[[:space:]]+/,/g
:将每个包含1个或多个空格字符的情况转换为单个逗号。发布于 2019-05-24 07:24:16
@Shawn的答案已经被OP接受了,我不确定我的答案是否值得发布,但允许我这样做只是为了提供信息。如果您选择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的默认变量中。s/\\\n//g;
通过合并行删除尾随的反斜杠。
split(/\n/)
再次将换行符上的行拆分回来。
/(\([^)]+\))|(\S+)/g
将是将每行划分为字段的最重要部分。字段模式定义为:"substring surrounded by parens OR substring which does not include whitespaces."
它在awk
中作为FPAT
工作,并保留括号之间的空格,而不分割其中的行。我已经测试过了。10,000行输入,执行时间不到一秒。
希望这能有所帮助。
https://stackoverflow.com/questions/56263613
复制相似问题