Sie sind nicht angemeldet.

1

26.09.2012, 23:41

Bestimmte Daten aus einem Textdokument filtern ..?

Ich stehe grade am Schlauch ...

Hab hier eine Textdokument (ca. 20mb groß Playliste) diese Datei wurde von einem alten Player erstellt (ich weiß leider nicht mehr von welchen ....) Nun gut jedenfalls wollte ich jetzt die Daten so aufbereiten das ich sie besser lesen kann da ich bestimmte Lieder suche in der Datei.

nach dem bearbeiten sollte die Datei so aussehen. (wäre mein Wunsch halt)

Quellcode

1
2
Überordner (musik richtung zb. Metal oder EBM usw.)
Album ->Band -> Musikname

sollte ja möglich sein oder nicht ?

Hab jetzt mit cut herumprobiert aber irgendwie ned das gewünschte Ergebnis bekommen und mit tr wollte ich vorher bestimmte Daten löschen um mit cut besser meine Daten herausfiltern aber naja logisches denken fehlt mir heute echt schwer schon ..hmm.
hatte so was probiert (angepasst an meine Verhältnisse) ...

Quellcode

1
cut -d\; -f1,3 copy_playlist.txt | tr \; '\t'


aber naja ich kapierst noch ned so recht was ich genau falsch mache damit ich die Ausgabe gern so bekomme wie ich sie gern hätte.
Die Datei ist so aufgebaut (siehe unten).

Jetzt wäre ich froh wenn mir einer sagen kann ob ich mit den befehlen oben auf dem Holzweg bin oder überhaupt andere befehle ich nehmen soll... ( Hilfestellung wäre cool wo ich selber noch was lernen kann ... )

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
file=/media/music/Alternative-Synthpop-Pop/And One/Krieger/02. NoFuture-Popmischung von O. Wollschläger.mp3
title=Track 2
artist=
album=
comment=
genre=
composer=
year=
track=2
disc=
length=401
file=/media/music/Alternative-Synthpop-Pop/And One/Krieger/03. Supersoft-Mischung von Oomph!.mp3
title=Track 3
artist=
album=
comment=
genre=
composer=
year=
track=3
disc=
length=245
file=/media/music/Alternative-Synthpop-Pop/And One/Krieger/04. Radio Fassung.mp3
title=Track 4
artist=
album=
comment=
genre=
composer=
year=
track=4
disc=
length=239
file=/media/music/Industrial-Noise-EBM/Hocico/Cronicas Letales I-IV/CD II/208_hocico-episodio.mp3
title=episodio
artist=Hocico
album=Crónicas Letales II
comment=
genre=Electronic
composer=
year=2010
track=19
disc=
length=228



lg schatti
''''''''''''''''''''''''''''''''''''''''''''''''
Gentoo-Linux
der G-Punkt eines Pc´s

''''''''''''''''''''''''''''''''''''''''''''''''

2

26.09.2012, 23:55

Die Datei sieht strukturiert aus, ich würde es gemütlich angehen (ungetestet):

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
cat copy_playlist.txt | while read textline; do
   file="$(echo "$textline" sed s/file=//g");

   read textline
   title="$(echo "$textline" sed s/title=//g");

   read textline
   artist="$(echo "$textline" sed s/artist=//g");

   .
   .
   .

   echo "$album" / "$artist" / "$title"
done


PS: eventuell würde Dir eine "pls" oder "m3u" Datei besser gefallen? Die könnte man damit und daraus auch basteln!
Auch wenn Open-Source kostenlos ist, ist sie nicht umsonst. Dein Preis ist Dein Engagement und Mitarbeit an OS-Projekten.
Wenn Du keinen Preis bezahlen willst, bist Du die Ware. Und das ist nicht Open Source, geschweigedenn frei.

3

27.09.2012, 01:39

ach stimmt mit dem sed - Befehl das hab ich total vergessen !! vielen dank für den Tipp !!!

hab ich das richtig verstanden sed list mit s den string aus und mit g fügt er es dann hinzu !?
(am besten aber ich guck mir morgen gleich mal "man sed" an ... bin gerade gezwungen auf einem Win-Lapi rum zu gurken :-( gruml ....)


Ne eine normale Textdatei ist mir lieber da ich so besser den Überblick habe was für CD's ich neu Rippen muss da mir eine von 2 alten Musikplatte angeraucht ist und ich will jetzt gucken welche ich nach Rippen muss die weg sind was so für mich einfacher geht da ich den Text dann einfach ausdrucke!!

m3u und pls ist ja von Winamp oder ned ?

danke bell nochmals für deine schnelle hilfe :-)

lg
schatti
''''''''''''''''''''''''''''''''''''''''''''''''
Gentoo-Linux
der G-Punkt eines Pc´s

''''''''''''''''''''''''''''''''''''''''''''''''

4

27.09.2012, 02:30

Zu sed,: ich kenne eigentlich nur die eine Funktion "s": Diese bedeutet "Suchen und ersetzen". Beispiel "s/file=//g" bedeutet Suche nach "file=" und ersetze durch "nichts". Was das "g" genau macht weiss ich ehrlich gesagt gar nicht genau.
Den "/" kann man durch jedes andere Zeichen ersetzen. Du kannst also auch "xufile=xxg" schreiben, hätte die selbe Funktionalität.

PS:

Zitat

bin gerade gezwungen auf einem Win-Lapi rum zu gurken
Da hilft nur noch "cygwin" und "andlinux" ;)
Auch wenn Open-Source kostenlos ist, ist sie nicht umsonst. Dein Preis ist Dein Engagement und Mitarbeit an OS-Projekten.
Wenn Du keinen Preis bezahlen willst, bist Du die Ware. Und das ist nicht Open Source, geschweigedenn frei.

5

27.09.2012, 08:47

Uh ... also sed ist was ganz was eigenes und hammer-mächtig. 's' heist substitute, also ersetzen. Und das 'g' am Ende meint, für die ganze Zeile und nicht nur für den ersten Treffer.

Dann: m3u ist nichts anderes als eine Playlist. Das File sollte idR. eigentlich alle MP3 Player erkennen.

Und zum Problem: wenn ich weiss, das es immer 11 Zeilen sind, die da hintereinander die einzelnen Felder angeben, dann würde ich zuerst mal das in ein CSV umformatieren. Das ist *wesentlich* einfacher: ein Record in einer Zeile, alle Felder mit ';' voneinander getrennt.

Und dann ist das Auslesen mit awk ein Kinderspiel.

Also so:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/bin/bash

function convert_to_CSV() {

    # as long there is a line
    cat ${1} | while read MUSIC[1]; do 

        # read in the other values
        for i in $(seq 2 11); do
            read MUSIC[${i}];
        done

        # write like a CSV line without the leading 'fieldname='
        for i in $(seq 1 11); do
            MUSIC[${i}]=$(echo ${MUSIC[${i}]} | sed 's/^.*=//')
            echo -n "${MUSIC[${i}]};"
        done
        echo
    done
}

convert_to_CSV music.txt > music.csv
awk -F ';' '{ print "Album " $4 " und Band: " $3 " und Musikname: " $1; }' music.csv


music.txt und music.csv sind dann die Dateien (copy_playlist.txt oder so)
http://www.dyle.org
IM-Account (Jabber!) sind auf meiner HP ...
There is no place like /home

http://www.gentooforum.de
http://www.gentoofreunde.org

<div>how to annoy a web developer?</span>

6

27.09.2012, 09:19

CSV ist eine sehr gute Idee. Du kannst die Datei dann zB. mit Libreoffice-Calc aufmachen und hast dann eine schöne Tabelle in der Du dann auch besser lesen, sortieren, filtern usw, kannst.
Auch wenn Open-Source kostenlos ist, ist sie nicht umsonst. Dein Preis ist Dein Engagement und Mitarbeit an OS-Projekten.
Wenn Du keinen Preis bezahlen willst, bist Du die Ware. Und das ist nicht Open Source, geschweigedenn frei.

7

27.09.2012, 18:01

Puh Leute ich bin noch ned so fit bei sed und awk :-)

danke für die hilfe ich hab mir heut ein buch gekauf sed & awk (kurz und gut)

melde mich später heut nochmal und sag bescheid wie es gelaufen ..

lg schatti
''''''''''''''''''''''''''''''''''''''''''''''''
Gentoo-Linux
der G-Punkt eines Pc´s

''''''''''''''''''''''''''''''''''''''''''''''''

8

28.09.2012, 00:40

Hmm also ich muss gestehen irgendwie kapier ich das noch ned so ganz ... hoffe ich nerv ned ...

Ok es wird die Datei copy_playlist.txt aus gelesen umgewandelt und als .csv abgespeichert soweit hab ich es noch verstanden.

Nur steig ich noch ned so ganz dahinter wie.

irgendwie suche ich in dem schript von dyle sowas wie

Quellcode

1
2
3
4
5
6
7
8
int zaehler = 0;
 
// die schleife wiederholt sich 3-mal
while( zaehler < 3 )
.
.
.
....


hmm wo seht das das er zb. nur 11 zeilen hat im script ?

naja ich geh mal schlafen vieleicht kann ich nacher besser denken ;-) ...

lg
schatti
''''''''''''''''''''''''''''''''''''''''''''''''
Gentoo-Linux
der G-Punkt eines Pc´s

''''''''''''''''''''''''''''''''''''''''''''''''

9

28.09.2012, 06:25

hmm wo seht das das er zb. nur 11 zeilen hat im script ?


Das war meine Annahme. Das Beispiel

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
file=/media/music/Alternative-Synthpop-Pop/And One/Krieger/02. NoFuture-Popmischung von O. Wollschläger.mp3
title=Track 2
artist=
album=
comment=
genre=
composer=
year=
track=2
disc=
length=401
file=/media/music/Alternative-Synthpop-Pop/And One/Krieger/03. Supersoft-Mischung von Oomph!.mp3
title=Track 3
artist=
album=
comment=
genre=
composer=
year=
track=3
disc=
length=245
...
entspricht diesem Muster.

Wenn du fix immer 11 Zeilen für einen Entrag hast, ist das so sehr bequem. Wenn du dich darauf nicht verlassen kannst, weil
a) nicht immer 11 Felder abgelegt sind, oder
b) die Reihenfolge anders ist
dann wird es anders.

Aber auch lösbar ... =)
http://www.dyle.org
IM-Account (Jabber!) sind auf meiner HP ...
There is no place like /home

http://www.gentooforum.de
http://www.gentoofreunde.org

<div>how to annoy a web developer?</span>

10

28.09.2012, 09:22

ach ne hab das falsch formuliert sorry, das es 11 Zeilen sind hab ich gemerkt und auch verstanden nur das was ich noch ned so kapiert hab
in deinem Script ist wo oder wie zählt das Script das es jetzt die zeile 2 oder 8 ausgeben muss ?

Quellcode

1
2
3
4
5
for ((x_seq=0; x_seq<50; x_seq++))
do
echo The sequence is ${x_seq}
done
fi


sowas in der art fehlt mir
naja ich werde mir mal das Buch zu Gemüte führen vielleicht steig ich danach mehr dahinter :-) aber nochmals vielen dank für die hilfe immer :-)
''''''''''''''''''''''''''''''''''''''''''''''''
Gentoo-Linux
der G-Punkt eines Pc´s

''''''''''''''''''''''''''''''''''''''''''''''''

11

28.09.2012, 09:29

Hier noch eine geeky-Lösung zum Erstellen der "csv":

Quellcode

1
cat copy_playlist.txt | tr "\n" ";" | sed 's/file=/\n/g;s/;[a-z]*=/;/g' > cpoy_playlist.csv

tr "\n" ";" Zeilenumbrüche durch ";" ersetzen => Alles in einer Zeile
s/file=/\n/g bei "file=" neue Zeilenumbrüche
s/;[a-z]*=/;/g Die Bezeichnungen vor = löschen

8)
Auch wenn Open-Source kostenlos ist, ist sie nicht umsonst. Dein Preis ist Dein Engagement und Mitarbeit an OS-Projekten.
Wenn Du keinen Preis bezahlen willst, bist Du die Ware. Und das ist nicht Open Source, geschweigedenn frei.

12

28.09.2012, 10:15

@Schattenschlag: Ach so! Du meinst: wie mache ich eine Schleife in der Bash?

Nun: nimm den seq Befehl, der macht:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
$ seq 1 10
1
2
3
4
5
6
7
8
9
10

und dann baue eine for-Schleife fertig:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
$ for i in $(seq 1 10); do echo ${i}; done
1
2
3
4
5
6
7
8
9
10


Und dann arbeite ich mit Array-Variablen hier. Das geht aber nur in der Bash.

@bell: hehehe ... nice.
http://www.dyle.org
IM-Account (Jabber!) sind auf meiner HP ...
There is no place like /home

http://www.gentooforum.de
http://www.gentoofreunde.org

<div>how to annoy a web developer?</span>

13

28.09.2012, 18:21

@bell jo ganz logisch was du da geschrieben hast ..... geeky lösung seh ich auch so :whistling:

@dyle danke für die erklärung ...

da sieht man wieder wer meister ist und padawan-schüler ;-) so und ich werde jetzt das buch wieder schnappen ....
''''''''''''''''''''''''''''''''''''''''''''''''
Gentoo-Linux
der G-Punkt eines Pc´s

''''''''''''''''''''''''''''''''''''''''''''''''