Aufteilen einer großen TXT-Datei alle 100 Zeilen und einschließlich des ursprünglichen Headers (auf einem Mac)

9644
Dan

Ich bin auf der Suche nach einem Werkzeug oder Skript (Textwrangler oder Terminal), das alle 100 Zeilen eine größere Textdatei aufteilen kann (Anzahl der ersten 4 sind Kopfzeilen) und einzelne TXT-Dateien ausgeben, die den ursprünglichen Header enthalten.

Zum Beispiel

Eingang:

File.txt line1 / line4 HEADER ... line5 / line265 DATA 

Ausgabe:

File_01.txt line1/line4 HEADER line5/line104 DATA  File_02.txt line1/line4 HEADER line5/line104 DATA  File_03.txt line1/line4 HEADER line5/line65 DATA 

Die Textdatei verwendet in diesem Fall Windows-Zeilenumbrüche (CR LF).

Ich mache dies derzeit manuell, daher sind alle Vorschläge, die diesen Prozess effizienter machen können, sehr willkommen.

1

2 Antworten auf die Frage

5
Nifle
  1. Entfernen Sie den Header und legen Sie ihn in eine separate Datei header.txt.
  2. spaltet die Daten mit split --lines=100 data.txt(diese generieren viele Dateien mit 100 Zeilen in ihnen jeweils genannten Xaa xab xac und so weiter)
  3. Führen Sie dann den Header jeder Datei voran. for a in x??; do cat header.txt $a > $a.txt; doneDadurch werden Ihre fertigen Datendateien (mit Headern) aufgerufenxaa.txt xab.txt xac.txt ...

Wenn die Datenmenge so groß ist (oder Sie in weniger Zeilen aufteilen), dass xxx-Dateien nicht ausreichen, wird aus vier mit Namen versehenen Dateien. In diesem Fall fügen Sie einen Zusatz ?in der forobigen Anweisung ein.

Bearbeiten:
Um das Extrahieren der Kopfzeile zu automatisieren, verwenden Sie head -4 origdata.txt > header.txtdie ersten vier Zeilen. Verwenden Sie tail -n +4 origdata.txt > data.txtalles, außer den ersten vier Zeilen zu extrahieren. Jetzt haben Sie zwei Dateien, eine mit der Kopfzeile und eine mit den Daten. Es sollte nicht zu schwer sein, dies zu einem Skript zu kombinieren. (Ich habe heute keinen Zugang zu bash)

Vielen Dank! Ich musste für "-l 100" "--lines = 100" einsetzen, ansonsten funktioniert es wie ein Zauber. Im Idealfall würde ich jedoch ein Skript oder einen einzeiligen Befehl bevorzugen, um die Arbeit zu erledigen, so dass es für Kollegen (weniger Computerfreak) einfacher ist, diese Aufgaben in meiner Abwesenheit zu übernehmen. Dan vor 14 Jahren 0
@ Dan - Du könntest alles in ein Skript mit ein bisschen Fummeln bringen. Sehen Sie sich meine Bearbeitung an, um den ersten Teil zu automatisieren. Nifle vor 14 Jahren 0
Ich habe es geschafft, Ihre Vorschläge zu einem Skript zusammenzustellen. Ich habe auch einige Variablen definiert, um den ursprünglichen Dateinamen in die Ausgabe aufzunehmen. Es enthält wahrscheinlich ein paar Scripting-Fauxpas, da ich noch relativ neu bin, aber es macht den Trick recht gut. Danke noch einmal! Dan vor 14 Jahren 0
3
Dan

Basierend auf der Antwort von Nifle habe ich ein Skript erstellt, das seine vorgeschlagenen Befehle ausführt, den ursprünglichen Dateinamen zur Ausgabe hinzufügt und die temporären Dateien bereinigt.

#!/bin/bash  FILE=$(ls -1 | grep filename.txt) NAME=$  head -4 $FILE > header.txt tail -n +5 $FILE > data.txt  split -l 100 data.txt  for a in x?? do cat header.txt $a > $NAME.$a.txt done  mv $FILE $NAME.orig.txt rm header.txt data.txt x?? 

Et voila!