使用sed、awk或其他工具从Linux命令行中的文本文件生成csv
我有一个包含数千行的文件,我希望将其作为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
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//
):
基本上:
- 在模式空间中读入一行
:如果模式空间以a结尾,请删除该反斜杠,读取下一行并将其附加到模式空间,然后重复此步骤:line/\\$/{s/\\$/;N;b line}
:将1个或多个空格字符的每一个大小写转换为一个逗号s/[:space:]+/,/g
- 打印结果,然后用新行返回到开头
- 使用sed的一些更模糊的功能(它可以做的不仅仅是
s//
):
基本上:
- 在模式空间中读入一行
:如果模式空间以a结尾,请删除该反斜杠,读取下一行并将其附加到模式空间,然后重复此步骤:line/\\$/{s/\\$/;N;b line}
:将1个或多个空格字符的每一个大小写转换为一个逗号s/[:space:]+/,/g
- 打印结果,然后用新行返回到开头
- 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
希望这有帮助。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
希望这有帮助。非常感谢。在接下来的10年里,我不会明白这一点。:-)恐怕结果中包含了不需要的逗号。@tshiono我没有注意到这些。不幸的是,在一个本身是空间分隔的区域中间的空间很难处理,非常感谢。在接下来的10年里,我不会明白这一点。:-)恐怕结果中包含了不需要的逗号。@tshiono我没有注意到这些。不幸的是,在一个本身是空间分隔的区域中间的空间要处理起来要困难得多。