Datei per Shellscript splitten?

Suchfunktion

Erfahrenes Mitglied
Hi!

Ich habe eine Datei (.csv, etwa 500MB groß) und meochte diese in z.B. jeweils 100 Zeilen-Ausgabe splitten.

Soll heissen:
Ich moechte aus der einen großen Datei ganz viele kleine Dateien machen, die z.B, jeweils 100 Zeilen beinhalten.

Ich verwende eigentlich fuer die Arbeit M$ Windows XP, aber da Wind**f gerne mal viel zu viel RAM missbraucht, um ueberhaupt stabil zu laufen und Linux eh viel toller ist (ich schleime mich mal ein bisschen bei euch ein ;-) ), moechte ich es damit versuchen.
(Ausserdem habe ich nichts vernuenftiges fuer Win gefunden...)

Nun denn: Wie kann ich eine Datei auf jeweils 100 Zeilen aufsplitten?
Ich habe hier auf Tutorials.de bereits ein Tutorial zum Aufsplitten in vorgegebene Dateigroessen gefunden, aber ich benoetige das Aufteilen in Zeilen-Anzahl und nicht Dateigroesse ;-)

mfg
Suche

P.S.:
Ich entschuldige mich fuer diese Anfaengerfrage, aber ich habe erst vor 2 tagen mit Shell-Scripting angefangen, daher kenne ich mich noch nicht so gut aus... :-(
 
Zuletzt bearbeitet:
Hi.

Code:
split -l 100 -a 3  500mbDatei.csv  500mbDatei_Ausgabe_csv.
Das zerlegt die Datei 500mbDatei.csv in jeweils 100 Zeilen Einzeldateien namens 500mbDatei_Ausgabe_csv.aaa, 500mbDatei_Ausgabe_csv.aab, 500mbDatei_Ausgabe_csv.aac usw.

:rtfm: "man split"

Gruß
 
Ahso, okay. *ich idiot*

Danke :-)


//Edit:
Ich benoetige mehrere .csv-Dateien als ausgabe.
Mit der Endung .aaa, .aab, .aac, etc. kann ich leider nichts anfangen :-(
Ich benoetige dann eher aaa.csv, aab.csv, etc...
 
Zuletzt bearbeitet:
Ich nochmal.

Dann benenn sie halt nach dem splitten um.

Gruß
Da das ganze spaeter per Cronjob laufen soll, ist das mit dem Umbenennen schwierig :-(


Ich habe es auch (erfolglos) hiermit versucht:
Code:
OUT=0
DATA=1
while read LINE;
do
	if [ $DATA -ne "100" ] 
		then
			$LINE > $OUT.txt 
			$DATA=`expr $DATA + 1`
		else
			$OUT=`expr $OUT + 1`
			$DATA=1
	fi
done < input.csv

Was ist daran falsch?
Ich bekomme in der Konsole den Fehler
split.sh: 13: 1=2: not found
split.sh: 13: "1;4;23;bla;blubb;...": not found

split.sh: 13: 1=2: not found
split.sh: 13: "2;4;23;foo;bar;...": not found

split.sh: 13: 1=2: not found
split.sh: 13: "3;4;23;lorem;ipsum;...": not found
(Die untere Zeile ist die jeweilis aktuelle Zeile aus der .csv-Datei.)

What's wrong?
 
Ich nochmal.


Da das ganze spaeter per Cronjob laufen soll, ist das mit dem Umbenennen schwierig :-(
Warum? Niemand hat gesagt, dass du das per Hand machen sollst.

Ich habe es auch (erfolglos) hiermit versucht:
Code:
OUT=0
DATA=1
while read LINE;
do
	if [ $DATA -ne "100" ] 
		then
			$LINE > $OUT.txt 
			$DATA=`expr $DATA + 1`
		else
			$OUT=`expr $OUT + 1`
			$DATA=1
	fi
done < input.csv

Was ist daran falsch?
Manchmal "vergisst" du eine Zeile, du überschreibst die Datei bei jedem Schleifendurchlauf - d.h. es steht immer nur eine Zeile drin - und du versuchst die Zeile aus der Datei als Kommando aufzurufen. Außerdem expandierst du die Variablen bei der Zuweisung.
Bash:
echo "$LINE" >> $OUT.txt

if [[ $((++DATA)) -gt 100 ]]; then
  DATA=1
  let ++OUT
fi
Gruß
 
Zuletzt bearbeitet:
Zurück