# Datei per Shellscript splitten?



## Suchfunktion (9. August 2007)

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... :-(


----------



## deepthroat (9. August 2007)

Hi.


```
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.

 "man split"

Gruß


----------



## Suchfunktion (9. August 2007)

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...


----------



## deepthroat (9. August 2007)

Suchfunktion hat gesagt.:


> *//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...


Dann benenn sie halt nach dem splitten um.

Gruß


----------



## Suchfunktion (9. August 2007)

Ich nochmal.



deepthroat hat gesagt.:


> 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:

```
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
> ...


(Die untere Zeile ist die jeweilis aktuelle Zeile aus der .csv-Datei.)

What's wrong?


----------



## deepthroat (9. August 2007)

Suchfunktion hat gesagt.:


> 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.



Suchfunktion hat gesagt.:


> Ich habe es auch (erfolglos) hiermit versucht:
> 
> ```
> OUT=0
> ...


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.

```
echo "$LINE" >> $OUT.txt

if [[ $((++DATA)) -gt 100 ]]; then
  DATA=1
  let ++OUT
fi
```
Gruß


----------

