एक पंक्ति में एक पैटर्न का पता लगाएं, और उसी रेखा से मिलान किए गए पैटर्न को जोड़ दें


0

मैं एक सीएसवी में सूचीबद्ध नोटों में से एक नौकरी नंबर खींचने की कोशिश कर रहा हूं, और फिर उस नंबर को पंक्ति के अंत में जोड़ दें, अधिमानतः sed, awk, grep या पर्ल (जो मैंने 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"

मैंने कोशिश की है कि मुझे सिड के साथ क्या कम पता है, लेकिन मैं ईमानदारी से अपनी गहराई से बाहर हूं।

जवाबों:


1

सरल पर्ल समाधान:

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

-F,कॉमा पर विभाजन (संख्या के बाद कॉमा डबल कोट्स के अंदर होने पर टूट सकता है, नीचे देखें)। जबकि अंतिम फ़ील्ड में नंबर होते हैं, उन्हें वर्तमान लाइन में जोड़ा जाता है।

इसे सही तरीके से हल करने के लिए, आपको पर्ल के टेक्स्ट :: 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;

स्क्रिप्ट पूरी तरह से काम करती है, और वन-लाइनर बहुत अच्छा है (एक लाइन-ब्रेक में फेंकने से अलग)। बहुत सराहना की।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.