Teilen Sie eine Datei in einer bestimmten Zeile in zwei Dateien auf


12

Ich suche nach einer Möglichkeit unter Unix, eine Datei mit einer bestimmten Zeilennummer in zwei Dateien aufzuteilen.

split -l 100 file_nameist nah an dem, wonach ich suche, aber dieser Befehl erstellt mehrere Dateien mit jeweils 100 Zeilen. Ich suche nach einem Befehl zum Teilen einer Datei in zwei Dateien mit einer bestimmten Zeilennummer. Gibt es eine Möglichkeit, dies unter Unix zu tun?

Antworten:


12

Eine etwas engere Lösung:

(head -100 > f1.txt; cat > f2.txt) < input.txt

1
Schöne Lösung. Kein Zählen mit wcvorher und die Eingabedatei wird immer noch nur einmal verarbeitet, wie bei der awkLösung.
Dubu

2
Es besteht eine geringe Wahrscheinlichkeit, dass headmehr als nur 100 Zeilen gelesen werden, um die ersten 100 Zeilen zu finden, an die ausgegeben werden soll f1.txt. Diese zusätzlichen Bytes werden von nicht gesehen cat.
Chepner

Das ist so verdammt langsam
sdaffa23fdsf

11

Verwenden Sie awk, damit Sie nur einen Durchgang durch die Eingabedatei machen müssen. Im Folgenden wird davon ausgegangen, dass Sie die ersten 122 Zeilen in der ersten Datei und den Rest in der zweiten Datei möchten.

awk 'NR < 123 { print >> "top_file"; next } {print >> "bottom_file" }' file_name

Dies verdient einen Daumen hoch. Wenn Sie eine Datei von X nach Y teilen möchten, ist dies am einfachsten.
Glenn Plas

Dies ist die am einfachsten zu verstehende Lösung. Arbeitete wie ein Zauber ... und lässt mich denken, ich sollte den Staub von meinem O'Reilly Sed & Awk-Buch entfernen, das ich seit ungefähr 1999 habe. Der sed-Abschnitt ist gut gelesen, der awk-Abschnitt nicht so sehr.
Michael

Dies ist besser als die ausgenommene Lösung aus dem Grund, den @chepner in den Kommentaren angegeben hat. Sie verlieren Zeichen in der Datei 'f2.txt'. Diese Lösung ist genau und effizient. awk ftw.
Goran

7

Sie können beide Teile verwenden headund tailerhalten:

head -n K file_name > top_file
tail -n L file_name > bottom_file

Dabei Kist die Zeilennummer und Ldie Anzahl der Zeilen von unten (Gesamtzahl der Zeilen - K).

(Sie können die Gesamtzahl der Zeilen mit erhalten wc -l file_name).


5

Sie können csplit(falls verfügbar) Folgendes verwenden:

csplit file N+1

teilt die Datei in zwei Teile, einen Teil bis zur Zeilennummer (einschließlich) Nund den anderen Teil von der Zeilennummer N+1bis zur letzten Zeile.
Wenn Sie bis zur Zeilennummer aufteilen möchten (diese jedoch nicht einschließen) N:

csplit file N

Das ist großartig! Danke, es hat das Problem perfekt für mich gelöst.
Zertrin

Beste Leistung zum Aufteilen von 20-GB-Dateien in Teile.
dr0i

@ dr0i - kein Wunder, csplitist für diesen Job optimiert.
don_crissti

Aufteilen einer 200M-Zeilen-Datei Ich habe "Speicher erschöpft" mit einem csplit aus dem Jahr 2008. Mit csplit aus dem Jahr 2011 funktioniert es :)
dr0i

4

Beide headund tailhaben Optionen, um Zeilen vom "anderen" Ende der Datei zu erzeugen, als dies sonst der Fall wäre. Sie haben also zwei Möglichkeiten:

head -n 100 source.txt > file1.txt
head -n -100 source.txt > file2.txt

oder (wobei NNN 100 kleiner ist als die Ausgabe von wc -l source.txt):

tail -n +NNN source.txt > file1.txt
tail -n NNN source.txt > file.txt

Sie können die Handbuchseiten für Ihre Versionen von headund tailfür weitere Informationen lesen .


0

Sie können 'wc', 'dc', 'head' und 'tail' verwenden. Dh

unix> wc -l foo
545 /tmp/foo
unix> dc -e '545 100 - p'
445
unix> head -n 100 foo > filea
unix> tail -n 445 foo > fileb

Zur Vereinfachung der Verwendung können Sie oben ein Shell-Skript erstellen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.