У меня есть файл 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)
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 "" }'
Поскольку лучший 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'
Другой способ сделать это с awk:
awk 'BEGIN{RS=","} /HRESETn/||/HCLK/||/HADDR/{var=$0; printf "."var;getline;getline;printf "("$0")"; if(var != "HADDR") printf RS}' cvsfile.cvs
Объяснение
Вывод
$ 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)
Вот a 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)