676 Stimmen

Wie kann ich einen bestimmten Bereich von Zeilen aus einer Textdatei unter Unix extrahieren?

Ich habe einen SQL-Dump mit ~23000 Zeilen, der Daten aus mehreren Datenbanken enthält. Ich muss einen bestimmten Abschnitt dieser Datei (d. h. die Daten für eine einzelne Datenbank) extrahieren und in eine neue Datei einfügen. Ich kenne sowohl die Anfangs- als auch die Endzeilennummer der gewünschten Daten.

Kennt jemand einen Unix-Befehl (oder eine Reihe von Befehlen), um alle Zeilen aus einer Datei zwischen z.B. Zeile 16224 und 16482 zu extrahieren und sie dann in eine neue Datei umzuleiten?

21voto

Tasos Papastylianou Punkte 20016

Menschen, die versuchen, ein Intervall für die Berechnung der head | tail Combo denken zu viel darüber nach.

So erhalten Sie den Bereich "16224 - 16482", ohne etwas zu berechnen:

cat file | head -n +16482 | tail -n +16224

説明する。

  • Le site + weist das head / tail Befehl zu " aufsteigen auf / starten von " (bzw.) die angegebene Zeilennummer vom Anfang der Datei an gezählt .

  • Ähnlich verhält es sich bei einer - weist sie an, " aufsteigen auf / starten von " (bzw.) die angegebene Zeilennummer vom Ende der Datei an gerechnet

  • Die oben gezeigte Lösung verwendet einfach head zunächst auf ' alles bis zur Höchstzahl halten ', und dann tail zweitens, auf ' alles von der untersten Nummer aufwärts behalten ', wodurch der interessierende Bereich definiert wird (ohne dass ein Intervall berechnet werden muss).

19voto

mmaibaum Punkte 2289
perl -ne 'print if 16224..16482' file.txt > new_file.txt

14voto

Tilman Vogel Punkte 8649

Auf den Schultern von boxxar stehend, gefällt mir das:

sed -n '<first line>,$p;<last line>q' input

z.B..

sed -n '16224,$p;16482q' input

Le site $ bedeutet "letzte Zeile", also macht der erste Befehl sed alle Zeilen ausdrucken, die mit Zeile beginnen 16224 und der zweite Befehl macht sed kündigen Drucklinie 16428 . (Hinzufügen 1 für die q -Bereich in der Lösung von boxxar scheint nicht notwendig zu sein).

Ich mag diese Variante, weil ich die Nummer der Endzeile nicht zweimal angeben muss. Und ich habe gemessen, dass mit $ hat keine nachteiligen Auswirkungen auf die Leistung.

10voto

Cetra Punkte 2565
 # print section of file based on line numbers
 sed -n '16224 ,16482p'               # method 1
 sed '16224,16482!d'                 # method 2

7voto

JP Lodine Punkte 439
cat dump.txt | head -16224 | tail -258

Das sollte genügen. Der Nachteil dieses Ansatzes ist, dass Sie die Arithmetik tun müssen, um das Argument für tail zu bestimmen und um zu berücksichtigen, ob Sie wollen, dass das "between" die Endzeile einschließt oder nicht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X