Teilen Sie eine Datei in zwei

18

Ich habe eine große Datei und muss sie in zwei Dateien aufteilen. Angenommen, in der ersten Datei sollen die 1000 Zeilen ausgewählt und in eine andere Datei eingefügt und diese Zeilen in der ersten Datei gelöscht werden.

Ich habe versucht mit, splitaber es erstellt mehrere Stücke.

Aravind
quelle
Hast du nachgesehen split --help?
Braiam
Ja, ich habe es überprüft, aber es werden mehrere Dateien erstellt, die ich nicht benötige.
Aravind

Antworten:

29

Der einfachste Weg ist wahrscheinlich zu verwenden headund tail:

$ head -n 1000 input-file > output1
$ tail -n +1001 input-file > output2

Damit werden die ersten 1000 Zeilen von input-filein output1und alle Zeilen von 1001 bis zum Ende in gesetztoutput2

Michael Mrozek
quelle
12

Ich denke, das splitist dein bester Ansatz.

Versuchen Sie es mit der -l xxxxOption, wobei xxxx die Anzahl der Zeilen ist, die in jeder Datei enthalten sein sollen (Standard ist 1000).

Sie können diese -n yyOption verwenden, wenn Sie sich mehr Gedanken über die Anzahl der erstellten Dateien machen. Die Verwendung -n 2teilt Ihre Datei in nur 2 Teile, unabhängig von der Anzahl der Zeilen in jeder Datei.

Mit können Sie die Anzahl der Zeilen in Ihrer Datei zählen wc -l filename. Dies ist der Befehl 'wordcount' mit der Option lines.

Verweise

  • man split
  • man wc
Lucien Raven
quelle
1
Auf diese Weise können Sie eine Reihe von Dateien mit einer festen Anzahl von Zeilen oder eine gleichmäßige Aufteilung in eine feste Anzahl von Dateien aufteilen. Gibt es eine Möglichkeit, eine 1000-Zeilen-Datei und eine Datei mit allem anderen aufzuteilen? Darum bat er; Ich konnte es nicht auf der Manpage finden
Michael Mrozek
Du hast recht, Michael. Ich glaube, ich habe die Frage stark vereinfacht. In diesem Fall ist Ihre Lösung die beste. Eine andere Möglichkeit wäre, den Befehl 'sed' zu verwenden: sed -n 1,1000 originalfile> first_1000_lines. sed '1,1000d' originalfile> residual_lines.
Lucien Raven
Natürlich könntest du das tun split -l 1000 bigfile && mv xaa piece1 && cat x?? > piece2 && rm x??.
G-Man sagt, dass Monica
8

Dies ist ein Job für csplit:

csplit -s infile 1001 

wird sgespalten ilently infile, das erste Stück xx00- bis zu aber nicht einschließlich Leitung 1001 und das zweite Stück xx01- die restlichen Zeilen.
Sie können mit den Optionen spielen, wenn Sie andere Ausgabedateinamen benötigen, z. B. -fein Präfix verwenden und angeben :

csplit -sf piece. infile 1001 

erzeugt zwei Dateien namens piece.00undpiece.01


Mit einem Smart headkönnten Sie auch Folgendes tun:

{ head -n 1000 > 1st.out; cat > 2nd.out; } < infile
don_crissti
quelle
1
Wow, es ist wirklich ist ein Job für csplit. Sehr schön. (Ich habe gerade die Liste der POSIX-Befehle durchgelesen und hatte große Probleme, mich csplitzuerst mit dem Zweck des Befehls zu befassen. Es stellt sich heraus, dass es wirklich sehr einfach ist.) :)
Wildcard
4

Eine einfache Möglichkeit, mit einem einzigen Befehl das zu tun, wonach die Frage verlangt:

awk '{ if (NR <= 1000) print > "piece1"; else print > "piece2"; }' bigfile

oder für diejenigen unter Ihnen, die es wirklich hassen, lange, intuitiv verständliche Befehle einzugeben,

awk '{ print > ((NR <= 1000) ? "piece1" : "piece2"); }' bigfile
G-Man sagt, "Monica wiedereinsetzen"
quelle