Wie kann ich eine datei zerlegen ?

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
Voyager_MP
Beiträge: 628
Registriert: 22.06.2004 10:04:07
Wohnort: Aachen

Wie kann ich eine datei zerlegen ?

Beitrag von Voyager_MP » 16.02.2012 11:13:43

Ich möchte ein txt file in an einer betimmten zeile in mehrere kleine txt files zerlege.

Code: Alles auswählen

2. Inbox Message (Unread)                                                                                                   
Date/time: 15/02/2012 15:50:55 +0100
Sender: +491737465743 Msg Center:
Text:
Tet
1. Inbox Message (Unread)
Date/time: 15/02/2012 16:06:26 +0100
Sender: +491737465743 Msg Center:
Text:
Gggggggg
Zeile zum unterteilen ist (Inbox Message (Unread)) hat einer eine Idee ?
Gruß Michel

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Wie kann ich eine datei zerlegen ?

Beitrag von Meillo » 16.02.2012 11:32:46

Code: Alles auswählen

csplit foo '/Inbox Message (Unread)/' '{*}'
Use ed once in a while!

Benutzeravatar
Voyager_MP
Beiträge: 628
Registriert: 22.06.2004 10:04:07
Wohnort: Aachen

Re: Wie kann ich eine datei zerlegen ?

Beitrag von Voyager_MP » 16.02.2012 11:38:09

Code: Alles auswählen

csplit /tmp/sms/test '/Inbox Message (Unread)/' '{*}' 
0
223
108
113

so und nu :) ?!?!
Gruß Michel

yeti

Re: Wie kann ich eine datei zerlegen ?

Beitrag von yeti » 16.02.2012 11:40:10

Code: Alles auswählen

$ ls -l
insgesamt 4
-rw-r--r-- 1 yeti yeti 219 16. Feb 11:35 DATEN
$ cat DATEN 
2. Inbox Message (Unread)
Date/time: 15/02/2012 15:50:55 +0100
Sender: +491737465743 Msg Center:
Text:
Tet
1. Inbox Message (Unread)
Date/time: 15/02/2012 16:06:26 +0100
Sender: +491737465743 Msg Center:
Text:
Gggggggg
$ awk '/^[0-9]+\. Inbox Message/ { f++ } { print >>f }' DATEN
$ ls -l
insgesamt 12
-rw-r--r-- 1 yeti yeti 107 16. Feb 11:38 1
-rw-r--r-- 1 yeti yeti 112 16. Feb 11:38 2
-rw-r--r-- 1 yeti yeti 219 16. Feb 11:35 DATEN
$ cat 1
2. Inbox Message (Unread)
Date/time: 15/02/2012 15:50:55 +0100
Sender: +491737465743 Msg Center:
Text:
Tet
$ cat 2
1. Inbox Message (Unread)
Date/time: 15/02/2012 16:06:26 +0100
Sender: +491737465743 Msg Center:
Text:
Gggggggg

Benutzeravatar
Voyager_MP
Beiträge: 628
Registriert: 22.06.2004 10:04:07
Wohnort: Aachen

Re: Wie kann ich eine datei zerlegen ?

Beitrag von Voyager_MP » 16.02.2012 11:42:17

sorry dumm von mir :) genau das was ich gesucht habe. Danke
Gruß Michel

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Wie kann ich eine datei zerlegen ?

Beitrag von Meillo » 16.02.2012 11:59:12

yeti hat geschrieben:

Code: Alles auswählen

$ awk '/^[0-9]+\. Inbox Message/ { f++ } { print >>f }' DATEN
Das ist die andere gute Variante. Hierbei sollte man nur aufpassen, die Dateien auch wieder zu schliessen, da einem in so einem Fall nur allzu schnell die Dateideskriptoren ausgehen.
Use ed once in a while!

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Wie kann ich eine datei zerlegen ?

Beitrag von Meillo » 16.02.2012 12:08:07

Voyager_MP hat geschrieben:

Code: Alles auswählen

csplit /tmp/sms/test '/Inbox Message (Unread)/' '{*}' 
0
223
108
113
so und nu :) ?!?!
Wie? Du fuehrst Code aus einem Forum aus, ohne zuvor (z.B. in den Manpages) zumindest grob herausgefunden zu haben was der Code tut? Das kann auch mal furchtbar in die Hose gehen ...

Und als das Ergebnis unerwartet oder unverstaendlich war, hast du einen Post im Forum verfasst, bevor du die Manpage des einzigen verwendeten Tools auch nur aufgemacht hast. Sonst haettest du naemlich diesen ersten Satz der Beschreibung gefunden:
Output pieces of FILE separated by PATTERN(s) to files ‘xx00’, ‘xx01’, ...,
and output byte counts of each piece to standard output.
Ich bin ein bisschen enttaeuscht. Meinst du, ich haette dir die Zeile hingeschrieben ohne selbst auch in der Manpage gelesen zu haben und mehrere Tests durchgefuehrt zu haben? Genau das habe ich naemlich getan. Nicht weil ich das nicht gerne tun wuerde, aber weil ich erwarte, dass das der Fragende das selbst auch tut bevor er fragt wieso die fertige Loesung (scheinbar) nicht so tut wie er denkt.

So, jetzt ist aber genug geschimpft. :-)
Use ed once in a while!

yeti

Re: Wie kann ich eine datei zerlegen ?

Beitrag von yeti » 16.02.2012 12:11:11

Meillo hat geschrieben:
yeti hat geschrieben:

Code: Alles auswählen

$ awk '/^[0-9]+\. Inbox Message/ { f++ } { print >>f }' DATEN
Das ist die andere gute Variante. Hierbei sollte man nur aufpassen, die Dateien auch wieder zu schliessen, da einem in so einem Fall nur allzu schnell die Dateideskriptoren ausgehen.

Code: Alles auswählen

$ awk '/^[0-9]+\. Inbox Message/ { f && close(f) ; f++ } { print >>f }' DATEN
(ungetestet, ich hab grad nicht hinreichend lange Testdaten zur Hand...)

uname
Beiträge: 12044
Registriert: 03.06.2008 09:33:02

Re: Wie kann ich eine datei zerlegen ?

Beitrag von uname » 16.02.2012 13:11:10

Code: Alles auswählen

for i in {1..100000}; do echo "hallo"; echo $i; done > test.txt                                              
awk '/^hallo/ { f++ } { print >>f }' test.txt 
Ich habe es mal getestet. Wenn man sich Debianlsof anschaut bei z.B. 100000 Abschnitten, so werden immer nur in meinem Fall ca. 1019 Textdateien offen gehalten. Offen sind laut lsof beispielhaft die Dateien 37725 bis 38744 (bei f==38744). Somit kann auf close(f) wohl verzichtet werden. Wäre nun interessant zu erfahren ob sich awk, die Bash oder das Betriebssystem um das aufräumen kümmert. Kennt sich jemand damit aus?

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Wie kann ich eine datei zerlegen ?

Beitrag von Meillo » 16.02.2012 13:53:47

uname hat geschrieben:

Code: Alles auswählen

for i in {1..100000}; do echo "hallo"; echo $i; done > test.txt                                              
awk '/^hallo/ { f++ } { print >>f }' test.txt 
Ich habe es mal getestet. Wenn man sich Debianlsof anschaut bei z.B. 100000 Abschnitten, so werden immer nur in meinem Fall ca. 1019 Textdateien offen gehalten. Offen sind laut lsof beispielhaft die Dateien 37725 bis 38744 (bei f==38744). Somit kann auf close(f) wohl verzichtet werden. Wäre nun interessant zu erfahren ob sich awk, die Bash oder das Betriebssystem um das aufräumen kümmert. Kennt sich jemand damit aus?
In einem der Buecher von Kernighan (das `K' in awk) ist ein eben solches Beipielprogramm enthalten und dazu ist explizit der Hinweis gegeben, dass man die Dateien schliessen sollte. (Damals hatte jeder Prozess nur rund 20 Deskriptoren zur Verfuegung.)

Was fuer ein awk hast du denn verwendet? Bestimmt gawk. Da ist bei mir das Verhalten ebenso: 1019 Files gleichzeitig offen und er schliesst automatisch nach Bedarf.

(Nur so am Rande: 1019 plus die drei Standarddeskriptoren sind 1022, noch ein Platz zum NULL-terminieren ... was haben die wohl mit dem letzten der 1024 Felder gemacht?)

Mawk sagt:

Code: Alles auswählen

mawk: cannot open "1017" for output (Too many open files)

Es ist eine Schande, dass ich gerade keinen Heirloom nawk zu Hand habe. :-(
Use ed once in a while!

uname
Beiträge: 12044
Registriert: 03.06.2008 09:33:02

Re: Wie kann ich eine datei zerlegen ?

Beitrag von uname » 16.02.2012 14:10:56

Ich nutze "gawk" und somit ist meine Frage beantwortet. (g)awk kümmert sich um die Deskriptoren. Ich glaube ich sollte auch mal ein Buch über "awk" lesen.

Antworten