Text in a 3 Wörter gruppieren

L

L0rd

Mitglied
Hallo,

habe einen Text (aus einem Windows(!) textfile) das so aus sieht so aus(hier ein Abschnitt)

Code:
Um die Mitte des 19. Jahrhunderts tritt Deutschland aus dem Reich der
Dichtung, Philosophie und Religion in das Reich der Industrie, Technik
und Politik hinaus. Aber die künstlerisch bedeutenden realistischen
Romane, die um diese Zeit entstehen (Immermanns "Münchhausen", 1838,
Ludwigs "Heiteretei", 1853, Freytags "Soll und Haben", 1855, Reuters
"Ut mine Stromtid", 1862-64, Raabes "Der Hungerpastor", 1864),
begleiten diese Entwicklung kaum. Ihre Welt ist die des alten
Deutschlands, des Bauerntums, der Gutsbesitzer, des Kleinbürgertums
geblieben. Die deutsche Kultur vermag die neuen, industriellen und
politischen Kräfte nicht schöpferisch zu durchdringen und zu formen.

und ich möchte es so haben

Code:
Um die Mitte
die Mitte des
Mitte des 19.
des 19. Jahrhunderts
19. Jahrhunderts tritt
Jahrhunderts tritt Deutschland
tritt Deutschland aus

also jeweils 3 nebenstehende Wörter die mit Leerstelle getrennt sind.
Wie ? :)

Danke !

PS.: der text ist von hier http://www.gutenberg.org/cache/epub/16264/pg16264.txt
 
bin nicht so mächtig in Shell und einzigste Lösung dass mir so einfällt: cut -d' ' -f1-3 wo ich 1 und 3 als Variablen in einer Schleife um 1 erhöhe, aber der Text muss dann ntürlich in einer Zeile stehen und CFLF konnte ich bis jetzt nicht in eine Zeile biegen :( obwohl DOS -> UNIX Umwandlungen von Textdateien ja ein klassischer Beispiel auf jeder Webseite, die sich mit Shell beschäftigt, ist. Ich müsste es sowieso modifizieren dass ich CFLF nicht in \n sondern in eine Leerstelle umwandele. Na gut ich möchte hier nicht auf meiner Lösung behaaren,
es geht doch sicherlich mit einem awk oder sed- Zauber bestimmt viel eleganter und perfomanter. Und wie allgemein bekannt ist nicht jeder ist ein Profi in awk oder regxp. Deswegen wende ich mich an euch.
 
Hi,

Wenn deine Eingabedatei (im Beispiel "DATA") nicht zu gross wird, könntest du einfach so etwas versuchen:
Code:
#!/bin/bash

set -- $(tr -d "\r" <DATA)
while [ "$3" ]; do
        echo $1 $2 $3
        shift
done
Gruss, A.
 
Probiers sonst einmal damit:
Code:
sed -r 's/(\S+\s+\S+\s+\S+)\s+/\1 \n/g' deineDatein.txt > neu.txt
wenn du einen anderen Umbruch als '\n' willst musst du das hatl austauschen. Das ganze benötigt GNU sed...

Grüsse
dizzgo
 
danke@floyd62
mit set kenne ich mich (noch) nicht aus, müsste genau kucken was da passiert, aber wie erkennst du die Leerstellen oder werden einzelne wörter standartmässig in Variable geschrieben ? Die Datei die ich habe (s. Link im ersten Beitrag) ist etwas über 500kB.

danke@dizzgo

ich müsste das dann so machen oder ?

Code:
sed -r 's/(\S+\s+\S+\s+\S+)\s+/\1 /g' deineDatein.txt > neu.txt
also nach \1 habe ich eine Leerstelle oder sollen es 2 sein ?
Wird die Zeile nach oben eingerückt wenn wir so einfach alle newlines löschen ?
 
Nein, gleich so wie ich es geschrieben habe, '\n' räpresentiert ein Newline. Das '\1' ist die Referenz auf die erste gematchte Gruppe aus der Regex.
 
Hi Lord,

ist eigentlich ganz einfach:
- mit dem 'tr'-Befehl innerhalb der Klammer eliminiere ich die CRs,
- mit $(tr ...) erhalte ich den restlichen Inhalt der Datei DATA als einen String, und
- mit "set -- ..." übernehme ich diesen String dann als Parameterlste
- die Shell verwendet dabei dann alle "Whitespace Charactes" (Blanks, Tabs, NLs) für die Aufteilung in die einzelnen Positionsparameter ($1, $2, $3, ...)
- da ich nicht weiss (und auch gar nicht wissen will), wieviele das werden, nehme ich jeweils die ersten 3, gebe sie mit echo aus, verwerfe dann den ersten (shift), und höre auf, wenn das letzte 3er-Paket ausgegeben ist.

Ich habe das gerade mal mit deiner Originaldatei ausprobiert, und das scheint auch ganz gut zu laufen:
Code:
$ bash -version
GNU bash, version 3.2.25(1)-release (i386-redhat-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.

$ cat _
#!/bin/bash

# set -- $(tr -d "\r" <DATA)
set -- $(wget -q -O - "http://www.gutenberg.org/cache/epub/16264/pg16264.txt" | tr -d "\r")
while [ "$3" ]; do
        echo $1 $2 $3
        shift
done

$ sh _ 
The Project Gutenberg
Project Gutenberg eBook,
Gutenberg eBook, Deutsches
eBook, Deutsches Leben
Deutsches Leben der
Leben der Gegenwart,
der Gegenwart, by
Gegenwart, by Philipp
by Philipp Witkop,
Philipp Witkop, Paul
...

Gruss, A.
 
danke floyd62,

komme leider immer noch nicht dazu es selbst auszuprobieren, aber wie es aussieht funktioniert das genau richtig.

...und das war warscheinlich die beste Antwort die ich je in einem Forum bekommen habe !


danke auch an dizzgo ! ;)
 
Zurück
Oben