Encontre um padrão em uma linha e anexe o padrão correspondente à mesma linha

0

Estou tentando extrair um número de trabalho das notas listadas em um csv e, em seguida, anexe esse número ao final da linha, preferencialmente por meio de sed, awk, grep ou perl (que instalei no Cygwin.

Aqui está uma maquete:

"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!"

deve se tornar:

"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"

Eu tentei o pouco que sei com sed, mas sinceramente estou fora de profundidade.

    
por Der Hochstapler 13.08.2013 / 03:31

1 resposta

1

Solução Perl simples:

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

-F, divide na vírgula (pode quebrar se a vírgula estiver entre aspas duplas após o número, veja abaixo). Embora existam números no último campo, eles são adicionados à linha atual.

Para resolvê-lo corretamente, você deve processar a entrada com o módulo Texto :: CSV do Perl.

#!/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;
    
por 13.08.2013 / 03:46