我有一个 csv 文件。我需要用它创建另一个文件。csv 文件如下
Signal Start,PK_SIG_NME,PK_SIGNALS_WIDTH,DESIGN_SIG_NME(exact string),, ,HRESETn ,1,~dcc_ares,, ,HCLK,1,dcc_clk,, ,HADDR, [31:0],i_dcc_qhs_haddr, etc
期望的输出是
.HRESETn(~dcc_ares), .HCLK(dcc_clk), .HADDR(i_dcc_qhs_haddr)
答案1
awk -F"," '{ gsub (" ", "", $7); print "."$7"("$9"), ."$12"("$14"), ."$17"("$19")" }'
对于 n 模式
awk -F"," '{ gsub (" ", "", $7); for ( i = 1 ; i <=(NF-2) ; i++) if ( ((i - 7) % 5 ) == 0 && (i - 7) >= 0 ) printf "."$i"("$(i+2)"), "; print "" }'
答案2
为了更好地支持 CSV,请perl
使用Text::CSV
#!/usr/bin/perl
use strict;
use warnings;
use Text::CSV;
my $file = $ARGV[0];
open my $fh, "<", $file or die "$file: $!";
my $csv = Text::CSV->new ({
binary => 1,
auto_diag => 1,
# uncomment the line below to avoid leading and trailing whitespaces
allow_whitespace => 1,
sep_char => ','
});
while (my $row = $csv->getline ($fh)) {
print ".$row->[6]($row->[8]), ";
print ".$row->[11]($row->[13]), ";
print ".$row->[16]($row->[18])\n";
}
close $fh;
将文件另存为./getit
,chmod +x getit
然后运行./getit input.csv
示例输出
.HRESETn(~dcc_ares), .HCLK(dcc_clk), .HADDR(i_dcc_qhs_haddr)
如果您收到如下错误消息:
"use Text::CSV;" - Can't locate Text/CSV.pm
通过以下方式安装正确的模块:
sudo apt-get install libtext-csv-perl
或者
perl -MCPAN -e'install Text::CSV'
答案3
使用 awk 的另一种方法:
awk 'BEGIN{RS=","} /HRESETn/||/HCLK/||/HADDR/{var=$0; printf "."var;getline;getline;printf "("$0")"; if(var != "HADDR") printf RS}' cvsfile.cvs
解释
- 将逗号视为记录分隔符。
- 找到所有 HRESETn 或 HCLK 或 HADDR 的字段,并打印它们
- 打印匹配字符串后的第二条记录,并用花括号括起来。
- 检查 HADDR 是否是我们最后打印的内容,如果不是,则在末尾添加逗号(这是为了消除尾随的逗号)
输出
$ awk 'BEGIN{RS=","} /HRESETn/||/HCLK/||/HADDR/{var=$0; printf "."var;getline;getline;printf "("$0")"; if(var != "HADDR") printf RS}' cvsfile.cvs
.HRESETn (~dcc_ares),.HCLK(dcc_clk),.HADDR(i_dcc_qhs_haddr)
答案4
这是一个python
解决方案:
#!/usr/bin/env python2
with open('/path/to/file.csv') as f:
for line in f:
parts = line.split(',')
print '.' + parts[6].rstrip() + '(' + parts[8] + ')' + ', .' + parts[11] + \
'(' + parts[13] + ')' + ', .' + parts[16] + '(' + parts[18] + ')'
该脚本将逐行读取 csv 文件
然后它会将文件分割为
,
(line.split(',')
)然后我们按照所需的格式打印所需的部分。
输出 :
.HRESETn(~dcc_ares), .HCLK(dcc_clk), .HADDR(i_dcc_qhs_haddr)