Zeilenmittelteil einer Textdatei extrahieren?

17

Ich schreibe ein PHP-Skript, um eine große Textdatei zu analysieren und Datenbankeinfügungen daraus zu machen. Allerdings ist die Datei auf meinem Host zu groß und ich habe die Speichergrenze für PHP erreicht.

Die Datei enthält ungefähr 16.000 Zeilen. Ich möchte es (zuerst) in vier separate Dateien aufteilen, um zu sehen, ob ich diese laden kann.

Den ersten Teil bekomme ich mit head -4000 file.txt. Die mittleren Abschnitte sind etwas kniffliger - ich dachte darüber nach, die tailAusgabe in head( tail -4001 file.txt | head -4000 > section2.txt) zu leiten , aber gibt es einen anderen / besseren Weg?

Eigentlich ist meine Logik durcheinander - für Abschnitt zwei müsste ich so etwas wie tail -12001 file.txt | head - 4000und dann das tailArgument für die nächsten Abschnitte senken . Ich bin schon durcheinander! : P

user394
quelle

Antworten:

27

Wenn Sie nicht durcheinander kommen möchten, es aber trotzdem mit tailund tun möchten head, gibt es eine nützliche Möglichkeit, taildie Zeilenanzahl von Anfang an und nicht vom Ende an aufzurufen :

tail -n +4001 yourfile | head -4000

... Aber ein besseres, automatisches Werkzeug, das nur zum Teilen von Dateien entwickelt wurde, heißt ... split! Es ist auch ein Teil von GNU coreutils, also sollte es jedes normale Linux-System haben. So können Sie es verwenden:

split -l 4000 yourInputFile thePrefixForOutputFiles

(Sehen Sie, man splitwenn Sie Zweifel haben.)

rozcietrzewiacz
quelle
19

Das Kombinieren von Kopf und Schwanz, wie Sie es getan haben, wird funktionieren, aber dafür würde ich verwenden sed

sed -n '1,4000p' input_file # print lines 1-4000 of input_file

Auf diese Weise können Sie Ihr Problem mit einer schnellen Shell-Funktion lösen

chunk_it(){
    step=4
    start=1
    end=$step
    for n in {1..4} ; do
        sed -n "${start},${end}p" "$1" > "$1".$start-$end
        let start+=$step
        let end+=$step
    done
}

chunk_it your_file

Jetzt haben Sie Ihre_Datei.1-4000 und Ihre_Datei.4001-8000 und so weiter.

Hinweis: Benötigt Bash

Sorpigal
quelle
3
Ich mag den sed Weg.
Fanchyna
Das funktioniert bei mir nicht, weil sed nicht beendet wird. Es druckt die Zeilen aus, die ich ausgeben möchte, aber ich muss Ctrl-C ausgeben, und als Ergebnis kann ich es nicht in eine Datei umleiten. Irgendwelche Vorschläge, um es nutzbar zu machen?
Brent212
Herausgefunden! "sed -n '<start_line>, <end_line> w <ausgabedatei>' <eingabedatei>" funktioniert bei mir.
Brent212
@ Brent212 Eine weitere zu beachtende Option besteht darin, dass Sie die Ausgabe auch in less umleiten oder in eine Datei umleiten können.
Kyle s