710 Stimmen

Wie kann ich eine große Textdatei in kleinere Dateien mit der gleichen Anzahl von Zeilen aufteilen?

Ich habe eine große (nach Anzahl der Zeilen) reine Textdatei, die ich in kleinere Dateien aufteilen möchte, ebenfalls nach Anzahl der Zeilen. Wenn meine Datei also etwa 2 Mio. Zeilen hat, möchte ich sie in 10 Dateien mit 200k Zeilen oder 100 Dateien mit 20k Zeilen aufteilen (plus eine Datei mit dem Rest; dass sie gleichmäßig teilbar ist, spielt keine Rolle).

Ich könnte dies ziemlich leicht in Python tun, aber ich frage mich, ob es irgendeine Art von Ninja Weg, dies zu tun mit Bash und Unix-Dienstprogramme (im Gegensatz zu manuell Schleife und Zählen / Partitionierung Zeilen).

3 Stimmen

Nur aus Neugier: Wie kann man sie nach dem "Aufteilen" "kombinieren"? Etwas wie "cat part2 >> part1"? Oder gibt es ein anderes Ninja-Dienstprogramm? Könnten Sie Ihre Frage aktualisieren?

14 Stimmen

Um es wieder zusammenzusetzen, cat part* > original

12 Stimmen

Ja, cat ist die Abkürzung für concatenate. Im Allgemeinen ist apropos nützlich, um geeignete Befehle zu finden. Siehe z.B. die Ausgabe von: apropos split

18voto

zmbush Punkte 2764

Verwenden Sie split :

Zerlegt eine Datei in Stücke fester Größe, erzeugt Ausgabedateien, die aufeinanderfolgende Abschnitte von INPUT enthalten (Standardeingabe, wenn keine angegeben ist oder INPUT `-' ist)

Syntax split [options] [INPUT [PREFIX]]

16voto

ghostdog74 Punkte 305138

Sie können auch Folgendes verwenden AWK :

awk -vc=1 'NR%200000==0{++c}{print $0 > c".txt"}' largefile

16voto

Denilson Sá Maia Punkte 43844

split (von GNU coreutils, da Version 8.8 vom 2010-12-22 ) enthält den folgenden Parameter:

-n, --number=CHUNKS     generate CHUNKS output files; see explanation below

CHUNKS may be:
  N       split into N files based on size of input
  K/N     output Kth of N to stdout
  l/N     split into N files without splitting lines/records
  l/K/N   output Kth of N to stdout without splitting lines/records
  r/N     like 'l' but use round robin distribution
  r/K/N   likewise but only output Kth of N to stdout

So, split -n 4 input output. erzeugt vier Dateien ( output.a{a,b,c,d} ) mit der gleichen Anzahl von Bytes, aber die Zeilen könnten in der Mitte unterbrochen sein.

Wenn wir ganze Zeilen beibehalten wollen (d.h. durch Zeilen getrennt), dann sollte dies funktionieren:

split -n l/4 input output.

Verwandte Antwort: https://stackoverflow.com/a/19031247

15voto

Harshwardhan Punkte 205

Verwendung:

sed -n '1,100p' filename > output.txt

Hier sind 1 und 100 die Zeilennummern, die Sie in output.txt .

12voto

m3nda Punkte 1823

Wenn Sie jede Datei nur nach x Zeilen aufteilen wollen, sind die gegebenen Antworten über split sind in Ordnung. Aber ich bin neugierig, warum niemand auf die Anforderungen geachtet hat:

  • "ohne sie zählen zu müssen" -> mit wc + cut
  • "den Rest in einer extra Datei zu haben" -> Split macht das standardmäßig

Ohne "wc + cut" geht das nicht, aber ich benutze das:

split -l  $(expr `wc $filename | cut -d ' ' -f3` / $chunks) $filename

Dies kann leicht zu Ihrer .bashrc Dateifunktionen, so dass Sie sie einfach aufrufen können, indem Sie den Dateinamen und die Chunks übergeben:

 split -l  $(expr `wc $1 | cut -d ' ' -f3` / $2) $1

Wenn Sie nur x Chunks ohne Rest in der zusätzlichen Datei haben wollen, passen Sie die Formel einfach so an, dass sie (Chunks - 1) für jede Datei summiert. Ich verwende diesen Ansatz, weil ich normalerweise nur x Dateien und nicht x Zeilen pro Datei haben möchte:

split -l  $(expr `wc $1 | cut -d ' ' -f3` / $2 + `expr $2 - 1`) $1

Du kannst das zu einem Skript hinzufügen und es deinen "Ninja-Weg" nennen, denn wenn nichts deinen Bedürfnissen entspricht, kannst du es bauen :-)

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