Text in a 3 Wörter gruppieren

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von L0rd, 26.03.2012.

  1. L0rd

    L0rd Mitglied

    Dabei seit:
    28.04.2006
    Beiträge:
    38
    Zustimmungen:
    0
    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
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. L0rd

    L0rd Mitglied

    Dabei seit:
    28.04.2006
    Beiträge:
    38
    Zustimmungen:
    0
    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.
     
  4. #3 floyd62, 27.03.2012
    floyd62

    floyd62 Routinier

    Dabei seit:
    01.05.2007
    Beiträge:
    309
    Zustimmungen:
    0
    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.
     
  5. dizzgo

    dizzgo Lernbereite Riesenratte

    Dabei seit:
    04.08.2005
    Beiträge:
    573
    Zustimmungen:
    0
    Ort:
    /ch/sg///
    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
     
  6. L0rd

    L0rd Mitglied

    Dabei seit:
    28.04.2006
    Beiträge:
    38
    Zustimmungen:
    0
    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 ?
     
  7. dizzgo

    dizzgo Lernbereite Riesenratte

    Dabei seit:
    04.08.2005
    Beiträge:
    573
    Zustimmungen:
    0
    Ort:
    /ch/sg///
    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.
     
  8. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  9. #7 floyd62, 27.03.2012
    floyd62

    floyd62 Routinier

    Dabei seit:
    01.05.2007
    Beiträge:
    309
    Zustimmungen:
    0
    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.
     
  10. L0rd

    L0rd Mitglied

    Dabei seit:
    28.04.2006
    Beiträge:
    38
    Zustimmungen:
    0
    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 ! ;)
     
Thema:

Text in a 3 Wörter gruppieren

Die Seite wird geladen...

Text in a 3 Wörter gruppieren - Ähnliche Themen

  1. Gemeinsame Wörter in zwei Texten finden?

    Gemeinsame Wörter in zwei Texten finden?: Hallo, habe zwei Textdateien und suche ein Kommando das mir beide Texte vergleicht und die Wörter die sowohl in der einen als auch in der...
  2. Kontextmenü mit einem Skript verbinden

    Kontextmenü mit einem Skript verbinden: Abend, wenn ich z. B. eine simple Umwandlung eines Bildformates in ein anderes über das KDE-Kontextmenü (Servicemenü nennt es sich im KDE oder...
  3. Timestamp an Inhalt einer Textdatei anfügen

    Timestamp an Inhalt einer Textdatei anfügen: Hallo, ich als neuer, unerfahrener Nutzer von Linux und der bash hätte folgende Frage. Und zwar würde ich gerne mit einem command den Zeitstempel...
  4. [code]Text[/code] im Editor nicht mehr vorhanden

    [code]Text[/code] im Editor nicht mehr vorhanden: Hallo, früher gab es im Editor noch den Button für das erstellen von Code-Segmenten. Ich hab das für Konsolen-Output oder angabe von Befehlen...
  5. Textdatei zeilenweise in durchnummerierte Variablen schreiben

    Textdatei zeilenweise in durchnummerierte Variablen schreiben: Hi Leute, ich versuche folgendes Problem zu lösen. Ich möchte eine Textdatei einlesen und den Inhalt jeder Zeile in immer eine neue Variable...