So teilen Sie Dateien an einer Zeilennummer [geschlossen]

94

Ich möchte eine 400.000 Zeilen lange Protokolldatei von einer bestimmten Zeilennummer trennen.

Lassen Sie uns für diese Frage eine beliebige Zahl von 300k festlegen.

Gibt es einen Linux-Befehl, mit dem ich dies tun kann ( innerhalb des Skripts )?

Ich weiß, dass splitich die Datei zu gleichen Teilen entweder nach Größe oder nach Zeilennummern aufteilen kann, aber das ist nicht das, was ich will. Ich möchte die ersten 300k in einer Datei und die letzten 100k in der zweiten Datei.

Jede Hilfe wäre dankbar. Vielen Dank!

Auf den zweiten Blick wäre dies eher für die Superuser- oder Serverfault-Site geeignet.

Denormalisator
quelle
16
Ich denke, diese Frage ist hier in Ordnung. Sie haben eine Programmieraufgabe, die Sie mit einem Shell-Skript lösen möchten. Wenn es sich um einen Einzeiler handelt, der weit verbreitete Unix-Tools verwendet, umso besser!
Jim Lewis
Ich dachte dasselbe. Aber andererseits habe ich kein Shell-Skript geschrieben :) na ja, ich habe meine Antwort trotzdem gefunden. Danke
Denormalizer
5
Diese Frage ist imho in Ordnung, ohne Zweifel, es ist eine Programmierfrage und sie ist auch nicht zu lokalisiert
Peter
9
Warum ist das eine Off-Topic-Frage? Die Gedankenpolizei ist verrückter als je zuvor.
Karel Bílek
6
Obwohl diese Frage ein wenig vom Thema abweicht, ist sie hoch bewertet und das erste Ergebnis in Suchmaschinen mit solchen Abfragen "Linux Split File at Line". Daher würde ich vorschlagen, diese Frage erneut zu öffnen, damit andere wertvolle Antworten hinzugefügt werden können. Oder stellen Sie zumindest einen Link zu der relevantesten Frage zu SU her.
Antoine Pinsard

Antworten:

178
file_name=test.log

# set first K lines:
K=1000

# line count (N): 
N=$(wc -l < $file_name)

# length of the bottom file:
L=$(( $N - $K ))

# create the top of file: 
head -n $K $file_name > top_$file_name

# create bottom of file: 
tail -n $L $file_name > bottom_$file_name

Beim zweiten Gedanken funktioniert die Aufteilung in Ihrem Fall auch, da die erste Aufteilung größer als die zweite ist. Split setzt also den Rest der Eingabe in den letzten Split

split -l 300000 file_name

ausgegeben xaamit 300K Linien und xabmit 100K Leitungen, für einen Eingang mit 400K Linien.

akademischer Roboter
quelle
Vielen Dank. fand eine ähnlich beantwortete Frage bei Superuser dh. benutze Schwanz usw. Und ja, Split funktioniert mit meinem Beispiel, aber nicht immer war mein Beispiel 100K.
Denormalizer
2
Wenn Sie dies unter Windows versuchen und Cygwin nicht verwenden möchten, bietet dieses Projekt alle erforderlichen Dienstprogramme als native Win32-Binärdateien - unxutils.sourceforge.net
Jonathon Hill
15
Ich würde verwenden , tail -n +L file_name > bottom_filewo einfach L=K+1ohne die Notwendigkeit zu laufen wczuerst
Hashbrown
2
Ich würde lieber verwenden sed -n '1,1000p' test.log > top_test.log ; sed '1,1000d' test.log > bottom_test.log. IHMO, dies ist einfacher und erfordert nicht die Berechnung der Gesamtzahl der Zeilen. Es funktioniert auch weiterhin, wenn zwischen der Ausführung jedes Befehls Zeilen angehängt wurden.
Antoine Pinsard
Bei einigen Dateien lässt diese Antwort eine Zeile aus, aber die von Hashbrown vorgeschlagene Bearbeitung behebt das Problem.
scharette