Eine Datei stückweise auslesen

E

elyps

Liebe Forenteilnehmer,

ich scheine gerade auf dem Schlauch zu stehen und frage deshalb nach einem Tipp von Euch.

Ich möchte eine Datei mit ewig vielen Zahlenwerten stückweise auslesen. Genauer gesagt soll beispielsweise mein Skript (beginnend ab der der 11. Zeile) jeweils 20 Zeilen dieser Datei auslesen und dann wegschreiben. Dies klappt soweit auch ganz gut mit dem knappen Befehl

sed -n '11,+20 p' matrix.txt > xy1.txt

In die zweite Datei (xy2.txt) sollen dann die folgenden 21 Zeilen der Datei matrix.txt geschrieben werden. Diese ganze Prozedur (Auslesen und Wegschreiben) soll wiederum 21 mal geschehen. Ich habe einiges ausprobiert, aber ich seh anscheinend den Wald vor lauter Bäumen nicht. Kann man mit sed eventuell einen Index hochlaufen lassen?

Hat einer von Euch einen kurzen Tipp?

Vielen Dank!
 
Du kannst das ja in einer for-Schleife laufen lassen:
(Zum Beispiel einmal die jeweils 20 Zeilen in xy1, dann die jeweils anderen 20 Zeilen in xy2. Die 120 musst halt entsprechend hoch setzen. Getestet ist's allerdings nicht)
Code:
for (( I=11; $I <= 120; I=I+40 ))
do
        sed -n '$I,+20 p' matrix.txt >> xy1.txt
done;
for (( I=21; $I <= 120; I=I+40 ))
do
        sed -n '$I,+20 p' matrix.txt >> xy2.txt
done;
oder so.
 
Zuletzt bearbeitet:
Vielen Dank für die schnelle Antwort. Leider führt dies nicht ganz zum Ziel. Wenn ich dies ausführe:

Code:
#!/bin/bash

for (( i=11; $i <= 120; i=i+40 ))
do
        sed -n '$i,+20 p' matrix.txt >> xy1.txt
done;
for (( i=21; $i <= 120; i=i+40 ))
do
        sed -n '$i,+20 p' matrix.txt >> xy2.txt
done;

werden zwei Dateien angelegt (xy1 und xy2), die jeweils folgenden Inhalt haben:
Code:
,+20 p
,+20 p
,+20 p
Diese Probleme mit einem laufenden Index hatte ich auch schon mehrfach und verzweifle noch daran ;-)

Ein weiteres Problem, welches ich ungenau beschrieben habe: Das Skript soll für jede 21 Zeilen (11-21, 22-42, 43-63, ...) eine Datei xy mit fortlaufender Nummerierung anlegen. Ich müsste also irgendwie einen weiteren Index integrieren, der hochgezählt wird. Leider kriege ich nicht einmal den einen zum Laufen...
 
Hm, ok, dann sollte jetzt aber

Code:
#!/bin/bash

INDEX=1;
for (( I=11; $I <= 451; I=I+21,++INDEX ));
do
	sed -n "$I,+20 p" matrix.txt > xy$INDEX.txt;
done;

Zumindest bekomme ich jetzt daraus aus einer matrix.txt 21 xy....txt-Dateien á 20 (fortlaufende) Zeilen. (11-31, 32-52, ...)
 
Zuletzt bearbeitet:
Hi,

Code:
#!/bin/bash

INDEX=1;
for (( I=11; $I <= 451; I=I+21,++INDEX ));
do
	sed -n "$I,+20 p" matrix.txt > xy$INDEX.txt;
done;

Zwei kleine Anmerkungen dazu noch:

1. Durchgaengig gross geschriebene Variablen werden im Allgemeinen fuer Konstanten oder Umgebungsvariablen verwendet.
Normale Variablen wuerde ich deswegen immer klein schreiben, um Verwechslungen zu vermeiden.

2. Wenn eine Variable in einen Text eingebettet werden soll, z.B. xy$index.txt, empfiehlt es sich der Eindeutigkeit halber die ${} schreibweise zu benutzen, also z.B. xy${index}.txt.
Dann ist klar was genau der Variablenname ist.

mfg,
bytepool
 
Vielen Dank, es hat geklappt! Ihr seid super!

Durch eine Kombination von sed und split klappt es schnell und reibungslos:
Code:
sed -n '11,451 p' matrix.txt >> matrix-output.txt
split -l 21 matrix-output.txt
Jetzt habe ich zwar ein weiteres Problem, aber ich eröffne lieber einen neuen Thread dafür, sonst gibts wohl Ärger mit den Moderatoren.
 

Ähnliche Themen

Textdatei filtern und löschen mit grep /sed

ca. 1200 PDF-Dateien auslesen und bestimmte Daten in eine CSV-Datei speichern

Prblem mit zeilenweises auslesen von Datei und schreiben nach mysql

CSV Datei mit sed manipulieren/optimieren/ergänzen

csv-Datei mit UNIX zurecht stutzen und Daten in xls-Datei laufend abspeichern

Zurück
Oben