Textpassagen extrahieren

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Colttt
Beiträge: 2986
Registriert: 16.10.2008 23:25:34
Wohnort: Brandenburg
Kontaktdaten:

Textpassagen extrahieren

Beitrag von Colttt » 26.01.2014 19:54:15

Hallo,

ich brauch eure hilfe.. ich habe folgende Datei:

Code: Alles auswählen

#P
...
....
....
#P
----
---
----
#P
:::::
:::::
::::
jedes mal wenn ein #P anfängt soll das ganze in eine neue Datei. Kann mir jmd sagen wie ich das in ein Bash-script verpacken kann.. ich denke das wird irgendwie mit cat, grep,und awk funktionieren, oder?

SChonmal danke für eure hilfe..
Debian-Nutzer :D

ZABBIX Certified Specialist

Benutzeravatar
SubOptimal
Beiträge: 1709
Registriert: 10.01.2005 23:25:46
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: bei Frankfurt

Re: Textpassagen extrahieren

Beitrag von SubOptimal » 26.01.2014 21:14:45

Hi,

hier eine kleine Quick and Dirty Lösung. Funktioniert zumindest mit dem von Dir gelieferten Beispiel.

Code: Alles auswählen

#!/bin/sh
fileno=0
while read line
do
    if [ "${line}" = "#P" ]
    then
      fileno=$((fileno+1))
      printf "" > output_${fileno}.txt
    fi
    echo "${line}" >> output_${fileno}.txt
done < input.txt
Grüße
SubOptimal

linuxCowboy
Beiträge: 287
Registriert: 05.02.2013 19:47:41

Re: Textpassagen extrahieren

Beitrag von linuxCowboy » 26.01.2014 21:45:13

this one:

Code: Alles auswählen

csplit -z filename '/#P/' '{*}'
coreutils forever!

Edit:
Wenn das '#P' stoert hilft der befreundete Streameditor:

Code: Alles auswählen

sed -i '/#P/d' x*
PS: Gegen die Spezialwaffen der Coreutils sieht Perl leider nie gut aus! :cry:
-der_linux_cowboy --- Besser werden! ... f*** w$$

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: Textpassagen extrahieren

Beitrag von Cae » 27.01.2014 00:02:18

awk-Einzeiler (die erste Zeile macht alles, der Rest ist nur Demonstration der Ausgabe):

Code: Alles auswählen

$ awk 'BEGIN{RS="#P\n";ORS=""}{print($0)>i++}' archive
$ ls
0  1  2  3  archive
$ awk '{print(FILENAME": "$0)}' *    # Ausgabe der Dateien mit deren Namen
1: file0
1: foo
2: file1
2: bar
3: file2
3: baz
archive: #P
archive: file0
archive: foo
archive: #P
archive: file1
archive: bar
archive: #P
archive: file2
archive: baz
$ 
./0 wird (leer) angelegt, weil vor dem ersten #P\n gemaess deinem Beispiel keine Daten sind (es wird als Trenner interpretiert). Falls das nicht gewuenscht ist, kann man stattdessen

Code: Alles auswählen

$ awk 'BEGIN{RS="#P\n";ORS=""}i++{print($0)>(i-1)}' archive
verwendet werden. Sinnvoller ist's allerdings, das Format selbst zu aendern. Eine typische Datei faengt ja auch nicht mit einer Newline an.

Falls der Dateiname der Teilstuecke nicht simpel eine aufsteigende Zahl sein soll, empfiehlt sich ein sprintf anstatt i (bzw. (i-1)) mit entsprechendem Formatstring.

Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

Colttt
Beiträge: 2986
Registriert: 16.10.2008 23:25:34
Wohnort: Brandenburg
Kontaktdaten:

Re: Textpassagen extrahieren

Beitrag von Colttt » 28.01.2014 08:12:00

Hallo und danke für die Hilfe!!

ich hab csplit von linuxCowboy genommen.. hat prima funktioniert..
das von Cae und awk ging nicht.. ich hatte vergessen das hinter dem #P noch etwas steht.. und vor dem ersten #P noch eine wichtige header-info steht.. (diese brauch ich vor jedem #P.., csplit macht das in eine extra datei so kann ich dass später wieder cat'en)

mit csplit geht das im script prima..
Debian-Nutzer :D

ZABBIX Certified Specialist

Antworten