行内のパターンを見つけ、一致したパターンを同じ行に追加します


0

私は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

シンプルな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;

スクリプトは完璧に機能し、ワンライナーも非常に優れています(改行を入れることは別として)。とても有難い。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.