Как grep csv информация о файле и поместить его в другой файл

У меня есть файл 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
задан 29 June 2015 в 14:44

3 ответа

Для лучшей поддержки 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'
1
ответ дан 23 May 2018 в 19:23
  • 1
    Я получаю сообщение об ошибке в строке 5 "use Text :: CSV; " - Не удается найти текст / CSV.pm – nani 6 July 2015 в 08:27
  • 2
    @NarayananPM sudo apt-get install libtext-csv-perl, я улучшил свой ответ. – A.B. 6 July 2015 в 09:35
  • 3
    У меня нет прав root для этого. Есть ли другой способ поместить его в новый файл. – nani 6 July 2015 в 09:39
  • 4
    @NarayananPM Это большая проблема. Вы должны задать новый вопрос. Извини :\ – A.B. 6 July 2015 в 09:43
  • 5
    @NarayananPM Хорошо, см. Мой ответ;) – A.B. 6 July 2015 в 09:47

Другой способ сделать это с 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)
0
ответ дан 23 May 2018 в 19:23

Вот решение 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)
0
ответ дан 23 May 2018 в 19:23

Другие вопросы по тегам:

Похожие вопросы: