2017-03-02 2 views
-1

Ich habe eine riesige Datei, die jeden Datensatz durch eine leere Zeile getrennt hat. Ich muss nur die Datensätze extrahieren, die eine bestimmte Zeichenfolge enthalten. Wie würdest du das angehen, sollte ich sed, awk, perl benutzen?extrahieren Datensätze aus einer riesigen Datei, mit einem Textmuster, mit sed, awk oder perl

Beispiel Eingabe:

firstrecord 
data 
moredata 

secondrecord 
data 
moredata2 

... 

Ich brauche alle Datensätze zu extrahieren moredata2 enthält, so Ausgabe

secondrecord 
data 
moredata2 

Perl-Code, ich habe es versucht, aber extrahiert jeden Datensatz in eine neue Datei sein würde,

Wie könnte ich alle Datensätze auf einmal extrahieren, und wie könnten die Muster aus einer Datei gelesen werden?

perl -00ne 's#PAT.*/(.*)\n##; open($F,">","$1.txt"); s/\n\s*(\n|$)//g; 
     print $F "$_\n"' original.txt 
+3

Also, was haben Sie versucht, für sich selbst? und wie hast du versagt?Bitte posten Sie Ihre eigenen Forschungsanstrengungen – Inian

Antwort

-1

awk zaubert in diesem Fall

awk -v RS= '/moredata2/{print (f?"\n":"")$0; f=1}' original.txt 

Sie erhalten,

 
secondrecord 
data 
moredata2 

... 
+0

Wie würdest du das ändern, um die moredata2-ähnlichen Werte aus einer txt-Datei lesen und jedes Mal in einer separaten Datei ausgeben zu können, wenn wir ein neues Muster finden? – Stelap

+0

'während lesen -r p; awk -v RS = -v Muster = "$ p" '$ 0 ~ Muster {print (f? "\ n": "") $ 0; f = 1} 'input_file.txt> "$ p.output"; done so etwas –

1

Bitte prüfen Sie, ob Ihnen dieser Code hilfreich sein kann. Und Sie können versuchen, so viel wie möglich zu vereinfachen.

use strict; 
use warnings; 

my $joinline = do { local $/; <DATA> }; 
while($joinline=~m/\n{2}((?:(?!moredata2).)*)moredata2\n/gs) 
{ 
    print "Matched: $&\n"; 
} 


__DATA__ 
firstrecord 
data 
moredata 

secondrecord 
data 
moredata2 

thirdrecord 
data 
moredata 

fourthrecord 
data 
moredata2 

Danke.

+0

Was, so ... Sie setzen den Datensatz Trennzeichen, aber dann die gesamte Datei iterieren es verketten? Und dann Regexabgleich? Das ist eine ziemlich hässliche Art zu schreiben 'my $ joinline = do {local $ /; }; ' – Sobrique

+0

Ok danke. Aktualisiert. – ssr1012

+0

Deshalb in meiner Antwort 'Und Sie können versuchen, so viel wie möglich zu vereinfachen. ' – ssr1012

0

Ein awk:

awk '/moredata2/' RS="" yourfile 

Erklärung

Eine andere Technik ist Leerzeilen getrennte Aufzeichnungen zu haben. Bei einer Sonderausgabe von bedeutet eine leere Zeichenfolge als Wert von RS , dass Datensätze durch eine oder mehrere Leerzeilen getrennt sind. Wenn RS auf die leere Zeichenfolge festgelegt ist, endet jeder Datensatz immer an der ersten leeren Zeile festgestellt. Der nächste Datensatz beginnt erst mit der ersten Zeile ohne Zeile , die auf folgt. Egal, wie viele Leerzeilen in einer Zeile erscheinen, sie alle fungieren als ein Datensatztrennzeichen. (Leerzeilen müssen vollständig leer sein;. Linien, die nur Leerzeichen enthalten, zählen nicht)

Überprüfen Sie die docs

3

Meine Antwort wäre - Verwendung Perl, Set $/ und regex gewünschten Datensätze gefunden.

$/ ist das Datensatztrennzeichen. Wenn Sie ihn auf einen leeren String setzen, wird er in den Modus 'Absatz' versetzt und iteriert somit nach Leerzeilen. Welches ist genau das, was Sie brauchen.

m/moredata2/ entspricht implizit dem aktuellen Block.

#!/usr/bin/env perl 

use strict; 
use warnings; 

local $/ = ''; 

while (<DATA>) { 
    if (m/moredata2/) { 
     print "Matched:\n"; 
     print; 
    } 
} 

__DATA__ 
firstrecord 
data 
moredata 

secondrecord 
data 
moredata2 
+0

Wie würden Sie Daten aus einer externen Datei lesen? und wie würdest du auch moredata2 und mehr muster lesen, wieder aus einer externen datei? – Stelap

+0

Das ist nicht die Frage, die du gestellt hast. Aber das Lesen aus einer Datei ist so einfach wie "Öffnen" und dann das Verwenden dieses Datei-Handle in der "while" -Schleife anstelle von "DATA". Das Lesen von Mustern aus einer anderen Datei ... ist auch eine Frage von "öffnen", lesen Sie es und kompilieren Sie einen regulären Ausdruck, der passend passt. – Sobrique

Verwandte Themen