ubuntuusers.de

Zwei Zeilen sortieren

Status: Gelöst | Ubuntu-Version: Ubuntu MATE 19.10 (Eoan Ermine)
Antworten |

HamburgJoe

Anmeldungsdatum:
7. Oktober 2017

Beiträge: 37

Moin Moin,

ich habe eine m3u Liste und möchte diese gern sortieren.

Allerdings gehören immer zwei Zeilen Zusammen.

Könntet Ihr mir dabei bitte helfen?

So sieht die Liste aus:

1
2
3
4
5
6
#EXTINF:-1 tvg-id="Sender 2" tvg-name="Sender 2" tvg-logo="http://000.000.000.000/irgendwas.png" group-title="Sender",Sender 2
http://irgendwas2.com
#EXTINF:-1 tvg-id="Sender 3" tvg-name="Sender 3" tvg-logo="http://000.000.000.000/irgendwas.png" group-title="Sender",Sender 3
http://irgendwas3.com
#EXTINF:-1 tvg-id="Sender 1" tvg-name="Sender 1" tvg-logo="http://000.000.000.000/irgendwas.png" group-title="Sender",Sender 1
http://irgendwas1.com

Und so soll es dann aussehen:

1
2
3
4
5
6
#EXTINF:-1 tvg-id="Sender 1" tvg-name="Sender 1" tvg-logo="http://000.000.000.000/irgendwas.png" group-title="Sender",Sender 1
http://irgendwas1.com
#EXTINF:-1 tvg-id="Sender 2" tvg-name="Sender 2" tvg-logo="http://000.000.000.000/irgendwas.png" group-title="Sender",Sender 2
http://irgendwas2.com
#EXTINF:-1 tvg-id="Sender 3" tvg-name="Sender 3" tvg-logo="http://000.000.000.000/irgendwas.png" group-title="Sender",Sender 3
http://irgendwas3.com

Vielen Dank im Voraus für Eure Hilfe! =)

Doc_Symbiosis

Avatar von Doc_Symbiosis

Anmeldungsdatum:
11. Oktober 2006

Beiträge: 4453

Wohnort: Göttingen

Was soll die Sortierung vorgeben? Die URL? Oder die EXTINFO?

HamburgJoe

(Themenstarter)

Anmeldungsdatum:
7. Oktober 2017

Beiträge: 37

Doc_Symbiosis schrieb:

Was soll die Sortierung vorgeben? Die URL? Oder die EXTINFO?

Die EXTINFO, sorry, die Info habe ich offensichtlich vergessen.

Ganz genau genommen geht es um tvg-name="Sender 2"

homer65

Avatar von homer65

Anmeldungsdatum:
8. November 2005

Beiträge: 586

Wohnort: bochum, germany

Arbeite mich gerade in C++ ein. Glaube, das ich schon in der Lage bin so ein Programm zu schreiben. Wenn du Interesse daran hättest und sich keine einfache anderweitige Lösung findet, würde ich ein entsprechendes Programm erstellen. Hilfreich wären allerdings ein paar Testdaten. Vermutlich handelte es sich nicht nur um die drei angeführten Datensätze.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13219

War für mich einfacher in Ruby

1
2
3
4
5
6
7
$ ./x.rb data
#EXTINF:-1 tvg-id="Sender 1" tvg-name="Sender 1" tvg-logo="http://000.000.000.000/irgendwas.png" group-title="Sender",Sender 1
http://irgendwas1.com
#EXTINF:-1 tvg-id="Sender 2" tvg-name="Sender 2" tvg-logo="http://000.000.000.000/irgendwas.png" group-title="Sender",Sender 2
http://irgendwas2.com
#EXTINF:-1 tvg-id="Sender 3" tvg-name="Sender 3" tvg-logo="http://000.000.000.000/irgendwas.png" group-title="Sender",Sender 3
http://irgendwas3.com

x.rb

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
#!/usr/bin/ruby

list = []
item = nil

ARGF.each_line do |line|
  case line
  when /^#/
    list << item if item
    item = line
  else
    item << line
  end
end

list << item if item

list.sort_by! {|x| x[/tvg-name="([^"]*)"/, 1]}
puts list

homer65

Avatar von homer65

Anmeldungsdatum:
8. November 2005

Beiträge: 586

Wohnort: bochum, germany

@rklm Schick, einfach und schnell. Da kann ich natürlich nicht mithalten. ☺

HamburgJoe

(Themenstarter)

Anmeldungsdatum:
7. Oktober 2017

Beiträge: 37

rklm schrieb:

War für mich einfacher in Ruby

1
2
3
4
5
6
7
$ ./x.rb data
#EXTINF:-1 tvg-id="Sender 1" tvg-name="Sender 1" tvg-logo="http://000.000.000.000/irgendwas.png" group-title="Sender",Sender 1
http://irgendwas1.com
#EXTINF:-1 tvg-id="Sender 2" tvg-name="Sender 2" tvg-logo="http://000.000.000.000/irgendwas.png" group-title="Sender",Sender 2
http://irgendwas2.com
#EXTINF:-1 tvg-id="Sender 3" tvg-name="Sender 3" tvg-logo="http://000.000.000.000/irgendwas.png" group-title="Sender",Sender 3
http://irgendwas3.com

x.rb

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
#!/usr/bin/ruby

list = []
item = nil

ARGF.each_line do |line|
  case line
  when /^#/
    list << item if item
    item = line
  else
    item << line
  end
end

list << item if item

list.sort_by! {|x| x[/tvg-name="([^"]*)"/, 1]}
puts list

Vielen Dank für Deine Hilfe, klappt wunderbar. Allerdings hätte ich die Ausgabe gern in eine neue m3u Datei. Könntest Du mir dazu einen Tip geben?

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11269

Wohnort: München

Du kannst die Ausgabe des Skripts in eine Datei umleiten (vgl. Shell/Umleitungen).

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13219

homer65 schrieb:

@rklm Schick, einfach und schnell. Da kann ich natürlich nicht mithalten. ☺

Ja, Ruby ist schon klasse - da macht das Programmieren gleich doppelt Spaß.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11269

Wohnort: München

Man könnte das mit Python3 noch etwas kompakter gestalten (das Skript akzeptiert Eingaben auf stdin oder Dateien als Argumente):

1
2
3
4
5
6
7
#!/usr/bin/env python3
import fileinput

lines = [line for line in fileinput.input() if line.strip()]  # filter empty and whitespace-only lines
for entry in sorted(((l1, l2) for l1, l2 in zip(lines[::2], lines[1::2])),
                    key=lambda x: x[0].partition('tvg-name="')[-1].partition('"')[0]):
    print(*entry, sep='', end='')

HamburgJoe

(Themenstarter)

Anmeldungsdatum:
7. Oktober 2017

Beiträge: 37

Habe die Ausgabe in eine Datei umgeleitet. Sorry, hatte da zu kompliziert gedacht.

Danke für Eure hilfe! =)

Antworten |