Tìm một mẫu trong một dòng và nối mẫu đó vào cùng một dòng


0

Tôi đang cố gắng rút số công việc ra khỏi ghi chú được liệt kê trong csv, sau đó nối số đó vào cuối dòng, tốt nhất là thông qua sed, awk, grep hoặc perl (mà tôi đã cài đặt trong Cygwin.

Đây là một mockup:

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

nên trở thành:

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

Tôi đã thử những gì tôi biết với sed, nhưng tôi thực sự ra khỏi chiều sâu của tôi.

Câu trả lời:


1

Giải pháp đơn giản Perl:

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

-F,chia tách trên dấu phẩy (có thể ngắt nếu dấu phẩy nằm trong dấu ngoặc kép sau số, xem bên dưới). Trong khi có các số trong trường cuối cùng, chúng được thêm vào dòng hiện tại.

Để giải quyết chính xác, bạn nên xử lý dữ liệu nhập với mô-đun Text :: CSV của 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;

Kịch bản hoạt động hoàn hảo, và một-liner cũng khá tốt (ngoài việc ném vào một ngắt dòng). Nhiều đánh giá cao.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.