Я пытаюсь извлечь номер задания из заметок, перечисленных в csv, а затем добавить этот номер в конец строки, предпочтительно через sed, awk, grep или perl (который я установил в Cygwin.

Вот макет:

"HD1231203", "1231232","fake.name","Lots of text before the job 150232 and then more"
"HD5164635", "8918123","more.fake","151243 and then some text"
"HD1541545", "8435413","last.fake","Oh look, we've got 150213 and 151487 this time!"

должен стать:

"HD1231203", "1231232","fake.name","Lots of text before the job 150232 and then more", "150232"
"HD5164635", "8918123","more.fake","151243 and then some text","151243"
"HD1541545", "8435413","last.fake","Oh look, we've got 150213 and 151487 this time!","150213","151487"

Я попробовал то, что мало знаю с помощью sed, но, честно говоря, я не в себе.

1 ответ1

1

Простое решение Perl:

perl -F, -lape '$_ .= qq(,"$1") while $F[-1] =~ /([0-9]+)/g' FILE

-F, разделяется на запятую (может сломаться, если запятая находится внутри двойных кавычек после числа, см. Ниже). Хотя в последнем поле есть числа, они добавляются к текущей строке.

Чтобы решить ее правильно, вы должны обработать ввод с помощью модуля Perl Text::CSV .

#!/usr/bin/perl
use warnings;
use strict;

use Text::CSV;

my $csv = 'Text::CSV'->new({ always_quote => 1,
                             allow_whitespace => 1,
                             eol => "\n",
                           }) or die 'Text::CSV'->error_diag;
open my $IN, '<', shift or die $!;
while (my $row = $csv->getline($IN)) {
    my @new;
    push @new, $1 while $row->[-1] =~ /([0-9]+)/g;
    $csv->print(*STDOUT, [@$row, @new]);
}
$csv->eof or $csv->error_diag;

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .