Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Удаление дубликатов строк из текстового файла со сравнением по две строки (http://forum.oszone.net/showthread.php?t=341065)

Uragan66 26-06-2019 23:26 2876994

Удаление дубликатов строк из текстового файла со сравнением по две строки
 
Доброго времени суток всем.
Знаю что тема уже изъезжена, но готового решения найти не получается.
Есть плейлисты (по сути текстовые файлы), при их создании может получаться большое количество дублирующих строк.
Например:
Код:

#EXTINF:0, 1+1
http://193.106.211.2:1234/udp/225.1.1.103:4001
#EXTINF:0, ICTV
http://193.106.211.2:1234/udp/225.1.1.104:4001
#EXTINF:0, 5 канал
http://193.106.211.2:1234/udp/225.1.1.105:4001
#EXTINF:0, СТБ
http://193.106.211.2:1234/udp/225.1.1.106:4001
#EXTINF:0, ТРК «Украина»
http://193.106.211.2:1234/udp/225.1.1.107:4001
#EXTINF:0, Сити
http://193.106.211.2:1234/udp/225.1.1.108:4001
#EXTINF:0, Тонис
http://193.106.211.2:1234/udp/225.1.1.111:4001
#EXTINF:0, ТЕТ
http://193.106.211.2:1234/udp/225.1.1.110:4001
#EXTINF:0, ТРК «Киев»
http://193.106.211.2:1234/udp/225.1.1.114:4001
#EXTINF:0, Тонис
http://193.106.211.2:1234/udp/225.1.1.111:4001
#EXTINF:0, Мега
http://193.106.211.2:1234/udp/225.1.1.112:4001
#EXTINF:0, М1
http://193.106.211.2:1234/udp/225.1.1.113:4001
#EXTINF:0, канал «Киев»
http://193.106.211.2:1234/udp/225.1.1.114:4001
#EXTINF:0, 2+2
http://193.106.211.2:1234/udp/225.1.1.115:4001
#EXTINF:0, ТРК «Украина»
http://190.106.210.2:1234/udp/225.1.1.107:4001

Строки обязательно должны считываться попарно: название канала - адрес потока. В примере три дубликата, в первом повторяются и название и адрес, во втором - только адрес, в третьем - только название. Из этих дублирующихся строк нужно удалить только те, где повторяются и название и адрес, то есть в примере только первую пару.
Пересмотрел кучу различных скриптов, сам пробовал батники писать, но все они считывают по одной строке и в выходном файле может получится к названию канала несколько адресов или наоборот.
К примеру такой батник:
Код:

@echo off
setlocal disableDelayedExpansion
set "file=%~1"
set "line=%file%.line"
set "deduped=%file%.deduped"
::Define a variable containing a linefeed character
set LF=^


::The 2 blank lines above are critical, do not remove
>"%deduped%" (
  for /f usebackq^ eol^=^%LF%%LF%^ delims^= %%A in ("%file%") do (
    set "ln=%%A"
    setlocal enableDelayedExpansion
    >"%line%" (echo !ln:\=\\!)
    >nul findstr /xlg:"%line%" "%deduped%" || (echo !ln!)
    endlocal
  )
)
>nul move /y "%deduped%" "%file%"
2>nul del "%line%"

в выходном файле делает так:
Код:

#EXTINF:-1  group-title="Познавательные",Brodilo.TV
http://brodilo.tv/channel.php
#EXTINF:-1  group-title="Познавательные",Da Vinci Learning
http://hls.peers.tv/streaming/da_vinci/16/tvrecw/playlist.m3u8|User-Agent=DuneHD/1.0.3
http://194.28.155.10:81/udp/225.0.55.26:1234
#EXTINF:-1  group-title="Прочие каналы:",112 Украина
#EXTINF:-1  group-title="Прочие каналы:",112 Украина HD
http://112hd-hls3.cosmonova.net.ua/hls/112hd_ua_mid/index.m3u8
http://app.live.112.events/hls-ua/112hd_mid/index.m3u8
#EXTINF:-1  group-title="Прочие каналы:",112 Украина [FHD]
#EXTINF:-1  group-title="Прочие каналы:",112 Україна
#EXTINF:-1  group-title="Прочие каналы:",112 Україна HD
#EXTINF:-1  group-title="Прочие каналы:",12 Канал (Омск)
http://12channel.bonus-tv.ru:80/stream549837052987/tracks-v1a1/mono.m3u8
#EXTINF:-1  group-title="Познавательные",Discovery Channel
http://st6.allplay.uz/iptv/4/index.m3u8
#EXTINF:-1  group-title="Познавательные",Discovery Channel HD
http://st6.allplay.uz/iptv/74/index.m3u8

Это отрывок из другого плейлиста, он слишком длинный для помещения в пример.
Другие скрипты делают аналогично.
Они сравнивают по одной строке.
Может кто подскажет как реализовать сравнивание строк попарно, чтобы не нарушалась структура плейлиста ?
Премного буду благодарен за помощь.

Iska 27-06-2019 04:07 2877006

Цитата:

Цитата Uragan66
Например: »

Так:
Код:

$aContent = Get-Content -Path 'C:\Мои проекты\0266\0001.txt'

@(for($i = 0; $i -le $aContent.Length - 1; $i = $i + 2) {
    $aContent[$i] + "`r`n" + $aContent[$i + 1]
}) | Sort-Object -Unique

Цитата:

Код:

#EXTINF:0, 1+1
http://193.106.211.2:1234/udp/225.1.1.103:4001
#EXTINF:0, 2+2
http://193.106.211.2:1234/udp/225.1.1.115:4001
#EXTINF:0, 5 канал
http://193.106.211.2:1234/udp/225.1.1.105:4001
#EXTINF:0, ICTV
http://193.106.211.2:1234/udp/225.1.1.104:4001
#EXTINF:0, канал «Киев»
http://193.106.211.2:1234/udp/225.1.1.114:4001
#EXTINF:0, М1
http://193.106.211.2:1234/udp/225.1.1.113:4001
#EXTINF:0, Мега
http://193.106.211.2:1234/udp/225.1.1.112:4001
#EXTINF:0, Сити
http://193.106.211.2:1234/udp/225.1.1.108:4001
#EXTINF:0, СТБ
http://193.106.211.2:1234/udp/225.1.1.106:4001
#EXTINF:0, ТЕТ
http://193.106.211.2:1234/udp/225.1.1.110:4001
#EXTINF:0, Тонис
http://193.106.211.2:1234/udp/225.1.1.111:4001
#EXTINF:0, ТРК «Киев»
http://193.106.211.2:1234/udp/225.1.1.114:4001
#EXTINF:0, ТРК «Украина»
http://190.106.210.2:1234/udp/225.1.1.107:4001
#EXTINF:0, ТРК «Украина»
http://193.106.211.2:1234/udp/225.1.1.107:4001


?

Uragan66 27-06-2019 07:09 2877016

Iska, спасибо! Да, выходной файл должен быть именно таким. Но у меня Ваш код почему-то не срабатывает. Входной файл остаётся без изменений.


P.S. Мои извинения, всё работает, это я с запуском затупил. Сейчас запуская скрипт батником:
Код:

@echo off
Powershell -File ./sortes.ps1 >> test.txt

файл test.txt получается без дублей.
Но есть некоторые нюансы. Скрипт ps1 нормально читает файлы только в кодировке ANSI, а в выходном файле кодировка OEM866 (это говорит AkelPad, а Notepad++ определяет как ANSI).
Можно как-то переделать на UTF-8 ?
А то на выходе, если в входном файле есть кавычки типа:
Код:

ТРК «Киев»
получается:
Код:

ТРК <Киев>
Спасибо!

greg zakharov 27-06-2019 09:02 2877027

Iska, (ради спортивного интереса) задачу можно решить короче через (MINGW|Cygwin|WSL):
Скрытый текст
Код:

sed 'N;s/\n/ - /' input.log | sort | sed 'N;/^\(.*\)\n\1$/!P;D' | sed 's/ - /\n/g'

Можно, правда, еще короче:
Скрытый текст
Код:

sed 'N;s/\n/ - /' input.log | sort | uniq | sed 's/ - /\n/g'

Если лог большой, лучше через parallel, а еще лучше и вовсе на чистом perl (также однострочник). Но это дело вкуса.

YuS_2 27-06-2019 11:27 2877040

Цитата:

Цитата greg zakharov
(ради спортивного интереса) задачу можно решить короче »

Код:

gc test.txt -r 2|%{"$($_[0])`n$($_[1])"}|sort -uni

greg zakharov 27-06-2019 13:50 2877054

YuS_2, ReadCount ведь уже установлен в пару, зачем там цикл? Просто select -u:
Код:

gc input.log -r 2 | select -u
или, если сортировка принципиальна:
Код:

gc input.log -r 2 | sort | select -u
pwsh прекрасно поймет, что от него хотят.

Uragan66 27-06-2019 14:10 2877061

Ребята, спасибо всем !
Но вопрос с кодировкой так и остался.
Входной файл/файлы в utf-8 и после скрипта, предложенного ув. Iska, с русскими символами на выходе беда, крякозябры выходят.
Сортировка в тексте не обязательна, главное удаление дублей парных строк.
С остальными скриптами не совсем разобрался, как их запускать.

greg zakharov 27-06-2019 14:12 2877062

Код:

gc input.log -encoding utf8 ...
При выводе в файл оператор перенаправления (>) "пишет" в utf8 (если ничего не путаю), но лучше использовать командлет Out-File для последующей записи в файл (в нем можно указать конечную кодировку).
Цитата:

Цитата Uragan66
С остальными скриптами не совсем разобрался, как их запускать.

Это - однострочники (для дзенствующих :) ), выполняются прямо в хосте pwsh.

YuS_2 27-06-2019 15:47 2877089

Цитата:

Цитата greg zakharov
ReadCount ведь уже установлен в пару, зачем там цикл? »

не помню, что-то там у меня сразу не пошло, вроде бы, строки перемешались в каком-то варианте, поэтому в цикл засунул, чтобы наверняка :)
Цитата:

Цитата greg zakharov
если сортировка принципиальна: »

у сорт, кстати, тоже есть параметр -Unique, т.е. достаточно:
Код:

gc test.txt -r 2|sort -u

Uragan66 27-06-2019 17:18 2877107

С кодировкой и выводом всё получилось.
Огромная благодарность всем за помощь!

greg zakharov 27-06-2019 18:25 2877120

Цитата:

Цитата YuS_2
тоже есть параметр -Unique

Ага, но в виду редкости его использования на практике, о нем легко позабыть.

Uragan66 27-06-2019 21:57 2877166

По ходу работы со скриптом, выяснились некоторые нюансы. Для скрипта, предложенного ув. Iska:
Цитата Iska:
Код:

$aContent = Get-Content -Path 'C:\Мои проекты\0266\0001.txt'

@(for($i = 0; $i -le $aContent.Length - 1; $i = $i + 2) {
 $aContent[$i] + "`r`n" + $aContent[$i + 1]
}) | Sort-Object -Unique

»
требуются идеальные пары строк: название канала - ссылка. И соответственно чётное количество строк.
В противном случае строки могут перемешаться, и ссылки не будут соответствовать.
Бывает попадаются файлы с различного рода мусором между строк. К примеру:
Код:

#EXTINF:-1 ,Первый канал
http://gorod.tv/s/live/1/46.252.219.59/1561632042766/0.m3u8
#EXTINF:-1 ,Россия 1
http://gorod.tv/s/live/2/46.252.219.59/1561632042766/0.m3u8
#EXTINF:-1 ,Матч ТВ
http://gorod.tv/s/live/3/46.252.219.59/1561632042766/0.m3u8
#EXTINF:-1 ,НТВ
http://gorod.tv/s/live/4/46.252.219.59/1561632042766/0.m3u8
#EXTINF:-1 ,Пятый канал
http://gorod.tv/s/live/5/46.252.219.59/1561632042766/0.m3u8
Здесь какая-то информация
http://gorod.tv/s/live/1/46.252.219.59/1561632042766/0.m3u8
#EXTINF:-1 ,Пятый канал
#EXTINF:-1 ,Россия К
http://gorod.tv/s/live/6/46.252.219.59/1561632042766/0.m3u8
#EXTINF:-1 , Москва 24
http://91.231.219.145:80/tv_moscow_24/video.m3u8
#EXTINF:-1 , Санкт-Петербург
http://91.231.219.145:80/tv_sankt_peterburg/video.m3u8
https://smarttvnews.ru/wp-content/uploads/2018/11/BT-2016-logo_color7890.png
https://smarttvnews.ru/wp-content/uploads/2018/11/BT-2016-logo_color7890.png
#EXTINF:-1 ,Discovery
http://hls-v3-spbtv.msk.spbtv.com/for_spb/msk/ipv3/154.m3u8
#EXTINF:-1 ,NASA TV
http://hls-v3-spbtv.msk.spbtv.com/for_spb/msk/ipv3/17.m3u8
#EXTINF:-1 ,Россия 24
http://gorod.tv/s/live/7/46.252.219.59/1561632042766/0.m3u8
#EXTINF:-1 ,Карусель
http://gorod.tv/s/live/8/46.252.219.59/1561632042766/0.m3u8

В примере вместо названия канала может быть что-то другое написано или канал может быть без ссылки. Или же прописаны ссылки на изображения.

Можно ли, перед выполнением основного кода скрипта, как-то удалить всё, что не соответствует парам канал - ссылка ? Регулярным выражением или дополнительным кодом в скрипт.
То есть первая строка название канала, обязательно начинающееся на #EXTINF, вторая строка - обязательно ссылка (могут быть http; https; rtmp; mms; rtmpe; udp).
Всё что не соответствует таким парам нужно удалить.

Uragan66 27-06-2019 22:53 2877174

Составил такой RegExp:
Код:

^(#EXTINF.*[^\n\r]+\r?\nhttps?:\/\/[^\n\r]+\r?\n?|#EXTINF.*[^\n\r]+\r?\nrtmp:\/\/[^\n\r]+\r?\n?|#EXTINF.*[^\n\r]+\r?\nmms:\/\/[^\n\r]+\r?\n?|#EXTINF.*[^\n\r]+\r?\nrtmpe:\/\/[^\n\r]+\r?\n?|#EXTINF.*[^\n\r]+\r?\nudp:\/\/[^\n\r]+\r?\n?)
Нужные пары строк то ищет, но не получается удалить всё, кроме найденного.

greg zakharov 27-06-2019 23:06 2877176

Код:

for ($i, $arr = 0, (gc input.log); $i -lt $arr.Length;) {
  $a, $b = $arr[$i], $arr[$i + 1] # потенциальная пара
  # критерий относительно которого формируется пара
  if ($a.StartsWith('#') -and $b -match ':\/\/') {
      # выводим пару в окно хоста
      "$a`n$b"
      # переходим на две позиции вперед
      $i += 2
  }
  else {
      # в противном случае переходим к следующему значению
      ++$i
      continue
  }
}

Должно вернуть:
Код:

#EXTINF:-1 ,Первый канал
http://gorod.tv/s/live/1/46.252.219.59/1561632042766/0.m3u8
#EXTINF:-1 ,Россия 1
http://gorod.tv/s/live/2/46.252.219.59/1561632042766/0.m3u8
#EXTINF:-1 ,Матч ТВ
http://gorod.tv/s/live/3/46.252.219.59/1561632042766/0.m3u8
#EXTINF:-1 ,НТВ
http://gorod.tv/s/live/4/46.252.219.59/1561632042766/0.m3u8
#EXTINF:-1 ,Пятый канал
http://gorod.tv/s/live/5/46.252.219.59/1561632042766/0.m3u8
#EXTINF:-1 ,Россия К
http://gorod.tv/s/live/6/46.252.219.59/1561632042766/0.m3u8
#EXTINF:-1 , Москва 24
http://91.231.219.145:80/tv_moscow_24/video.m3u8
#EXTINF:-1 , Санкт-Петербург
http://91.231.219.145:80/tv_sankt_peterburg/video.m3u8
#EXTINF:-1 ,Discovery
http://hls-v3-spbtv.msk.spbtv.com/for_spb/msk/ipv3/154.m3u8
#EXTINF:-1 ,NASA TV
http://hls-v3-spbtv.msk.spbtv.com/for_spb/msk/ipv3/17.m3u8
#EXTINF:-1 ,Россия 24
http://gorod.tv/s/live/7/46.252.219.59/1561632042766/0.m3u8
#EXTINF:-1 ,Карусель
http://gorod.tv/s/live/8/46.252.219.59/1561632042766/0.m3u8


Uragan66 28-06-2019 07:58 2877195

greg zakharov, спасибо большое!
Но у меня почему-то не получается запустить скрипт, выдаёт ошибку компиляции:

greg zakharov 28-06-2019 08:59 2877201

Uragan66, ничего удивительного: вы пытаетесь запустить сценарий pwsh как WSH, - последнему ничего не известно о синтаксисе PowerShell.

Uragan66 28-06-2019 09:07 2877202

greg zakharov, извините, думал, что скрипт нужно запускать как js.
Теперь разобрался... Большая благодарность за скрипт!

Uragan66 28-06-2019 11:34 2877212

Немного подправил скрипт под свою задачу:
Код:

@(for($i, $arr = 0, (gc .\*.m3u -Encoding utf8); $i -lt $arr.Length;) {
  $a, $b = $arr[$i], $arr[$i + 1] # потенциальная пара
  # критерий относительно которого формируется пара
  if ($a.StartsWith('#EXTINF') -and $b -match ':\/\/') {
      # выводим пару в окно хоста
      "$a`n$b"
      # переходим на две позиции вперед
      $i += 2
  }
  else {
      # в противном случае переходим к следующему значению
      ++$i
      continue
  }
}) | Sort-Object -Unique | Out-File .\out.m3u -Encoding utf8

Отрабатывает отлично...
Ещё раз большое спасибо всем за помощь!

Uragan66 24-08-2019 15:30 2885298

Здравствуйте!
Использую, подсказанный ув. greg zakharov, скрипт:
Код:

@(for($i, $arr = 0, (gc .\*.m3u -Encoding utf8); $i -lt $arr.Length;) {
  $a, $b = $arr[$i], $arr[$i + 1] # потенциальная пара
  # критерий относительно которого формируется пара
  if ($a.StartsWith('#EXTINF') -and $b -match ':\/\/') {
      # выводим пару в окно хоста
      "$a`n$b"
      # переходим на две позиции вперед
      $i += 2
  }
  else {
      # в противном случае переходим к следующему значению
      ++$i
      continue
  }
}) | Sort-Object -Unique | Out-File .\out.m3u -Encoding utf8

Скрипт работает отлично, ещё раз большое спасибо!
Но бывает возникает необходимость пускать на вход не один файл, а несколько.
Подскажите, пожалуйста, можно ли для обработки скриптом прописать не один файл, а папку с файлами одного расширения ?
Буду премного благодарен за ответы и подсказки.

DJ Mogarych 24-08-2019 15:58 2885302

Цитата:

Цитата Uragan66
можно ли для обработки скриптом прописать не один файл, а папку с файлами одного расширения ? »

Код:

gc C:\temp\*.txt

Uragan66 24-08-2019 18:00 2885310

DJ Mogarych, так не пойдёт для нескольких файлов, сам скрипт написан для обработки только одного файла. Нужно его изменить на multiple, только, увы, я не знаю как.

YuS_2 24-08-2019 18:44 2885312

Цитата:

Цитата Uragan66
так не пойдёт для нескольких файлов »

оформите весь код в функцию и считывайте файлы по одному с вызовом функции...
Код:

function set-outfile {
    process{
        $file = 'out_'+$_.name
        @(for($i, $arr = 0, (gc $_.fullname -Encoding utf8); $i -lt $arr.Length;) {
          $a, $b = $arr[$i], $arr[$i + 1] # потенциальная пара
          # критерий относительно которого формируется пара
          if ($a.StartsWith('#EXTINF') -and $b -match ':\/\/') {
              # выводим пару в окно хоста
              "$a`n$b"
              # переходим на две позиции вперед
              $i += 2
          } else {
              # в противном случае переходим к следующему значению
              ++$i
              continue
          }
      }) | Sort-Object -Unique | Out-File $file -Encoding utf8
    }
}

dir .\каталог\* -inc *.m3u -file|set-outfile


Uragan66 24-08-2019 21:09 2885326

YuS_2, спасибо большое. Это то, что нужно.

Alex2010god 02-08-2020 13:18 2929944

Вложений: 1
Привет!Что то пошло не так,помогите пожалуйста понять,на скриншоте во вложении все видно.

Busla 02-08-2020 13:49 2929949

Alex2010god, у вас старая версия PowerShell, скрипт использует новые возможности. Обновите PoSh до 5.1

Alex2010god 02-08-2020 20:38 2929986

Вложений: 1
Установил 5.1 никаких изменений кроме того что пропал русский язык(как вернуть рус.яз на место?)

Iska 03-08-2020 05:48 2930018

Цитата:

Цитата Alex2010god
никаких изменений »

Напротив. Теперь совсем другая ошибка.

В том каталоге, откуда Вы пытаетесь исполнять код (на Вашем скриншоте это каталог профиля текущего пользователя), отсутствует каталог с именем «каталог».

Alex2010god 03-08-2020 07:47 2930028

Благодарю!Далек от программирования - ничего не понял из Вашего ответа(что нужно сделать что бы каталог появился?)...

Как вернуть русский язык для PowerShell 5.1?

YuS_2 03-08-2020 10:32 2930036

Цитата:

Цитата Alex2010god
ничего не понял из Вашего ответа(что нужно сделать что бы каталог появился?)... »

необходимо вместо .\каталог указать правильный путь к существующему каталогу, в котором находятся файлы для обработки.

Цитата:

Цитата Alex2010god
Как вернуть русский язык для PowerShell 5.1? »

Никак... ну или пожаловаться в ООН на микрософт, на ущемление прав русскоязычных пользователей :) ... шутка.

Alex2010god 04-08-2020 09:25 2930106

В начале скрипта указан адрес:
$aContent = Get-Content -Path 'D:\1\FILMOTEKA.M.C+\F.m3u'
просто вписать вместо .\каталог
так .\D:\1\FILMOTEKA.M.C+\F.m3u
или еще как ни будь?

YuS_2 05-08-2020 20:51 2930255

Цитата:

Цитата Alex2010god
В начале скрипта указан адрес: »

Хмм... на кофейной гуще не гадаю. :)
Где это видно?
Покажите полностью, что Вы запускаете, какая при этом возникает ошибка и главное - что в итоге желаете получить.
А применительно к указанному выше скрипту:
Код:

function set-outfile {
    process{
        $file = 'out_'+$_.name
        @(for($i, $arr = 0, (gc $_.fullname -Encoding utf8); $i -lt $arr.Length;) {
          $a, $b = $arr[$i], $arr[$i + 1] # потенциальная пара
          # критерий относительно которого формируется пара
          if ($a.StartsWith('#EXTINF') -and $b -match ':\/\/') {
              # выводим пару в окно хоста
              "$a`n$b"
              # переходим на две позиции вперед
              $i += 2
          } else {
              # в противном случае переходим к следующему значению
              ++$i
              continue
          }
      }) | Sort-Object -Unique | Out-File $file -Encoding utf8
    }
}
$fld = 'D:\1\FILMOTEKA.M.C+\*'
dir $fld -inc *.m3u -file|set-outfile

путь можно указывать как относительный, так и абсолютный. Переменная $fld будет содержать тот путь, который Вы укажете и соответственно, от его правильности будет зависеть успешное выполнение скрипта.

Alex2010god 07-08-2020 20:08 2930468

Так все же видно на скриншотах(опубликованных ранее в теме,ничего не менял кроме версии ПоверШелл).

YuS_2 07-08-2020 20:36 2930469

Цитата:

Цитата Alex2010god
Так все же видно на скриншотах »

1. Забудьте про эту гадость, в смысле про Powershell ISE, запускайте скрипты в консоли или используйте VS Code...
2. Скрипт лучше показывать в текстовом виде, а не скриншотами...
3.
Цитата:

Цитата Alex2010god
В начале скрипта указан адрес:
$aContent = Get-Content -Path 'D:\1\FILMOTEKA.M.C+\F.m3u' »

Это никакой не адрес, это считывание данных из файла и их запись в переменную... которая нигде более не используется.
4.
Цитата:

Цитата YuS_2
и главное - что в итоге желаете получить. »

? На скриншоте никакого вопроса не видно :)

Foreigner 07-08-2020 20:47 2930470

Если нужны уникальные пары строк, то лучше наверное:

Код:

Get-Content 1.m3u -ReadCount 2 | Sort-Object | Get-Unique

YuS_2 07-08-2020 21:31 2930471

Цитата:

Цитата Foreigner
Если нужны уникальные пары строк, то лучше наверное: »

здесь не просто уникальные пары нужны были, тут учитываются ошибочно составленные плейлисты и код, предложенный greg zakharov выправляет их, он просто завернут в функцию, которая обрабатывает несколько файлов сразу из определенного каталога ... в общем, выше по топику всё есть.

Alex2010god 08-08-2020 00:53 2930488

Для меня темный лес,ну попытался и не получилось(зря только версию на русском языке "ПоверШелл" сменил на английскую).
Цель была такова - обработать плейлист IPTV и выявить и удалить дубликаты.
Проще было бы батник скрипта сделать(положил в папку с плейлистом,нажал он сам все сделал и выдал готовый плейлист с тем же именем+цифра 01,последующий обработанный плейлист 02 и Т.Д.)
На просторах "паутины" нашел программу - без оболочки которая все это делает в один клик(искал неделю или две).

YuS_2 08-08-2020 12:02 2930511

Цитата:

Цитата Alex2010god
Цель была такова - обработать плейлист IPTV и выявить и удалить дубликаты. »

Создание скрипта, правильно решающего задачу, зависит от правильного составления условий той задачи...
Здесь существует несколько если:
Если плейлист составлен верно и в нем нет ошибок, описанных выше,
Если в плейлисте отсутствуют "лишние" строки, как-то, например маркер плейлиста (#EXTM3U) и т.п.,
Если цель - исключительно только удалить дублирующиеся ПАРЫ строк,
то для одного файла, достаточно запустить такой скрипт:
http://forum.oszone.net/post-2877089.html#post2877089

Код:

# Здесь в одинарных кавычках необходимо указать свои: путь к файлу и наименование файла
$file = gi 'd:\исходный каталог\исходный файл.m3u'
# Формируем имя выходного файла:
$out = $file.directoryname + $file.basename + '_out' + $file.extension
# Удаляем дубликаты пар строк с одновременной сортировкой:
gc $file -r 2|sort -uni|out-file $out -enc utf8

Но, если необходима обработка в определенном каталоге всех файлов, в которых, как правило, как минимум, в наличии маркер плейлиста, то:
Код:

function delete-marker {
        process{
                $file = $_.fullname
                if (($a = gc $_.fullname -enc utf8)[0] -match '^#EXTM3U'){
                        $a[1..$a.length]|out-file $file -enc utf8
                }
        }
}

function set-outfile {
        process{
                $out = $_.directoryname + '\' + $_.basename + '_out' + $_.extension
                # Удаляем дубликаты пар строк с одновременной сортировкой
                gc $_.fullname -r 2 -enc utf8|sort -uni|out-file $out -enc utf8
        }
}

# Путь к каталогу с исходными файлами (астериск * - указывать обязательно):
$fld = 'D:\1\FILMOTEKA.M.C+\*'

# Сначала удаляем маркеры плейлиста из файлов:
$arr = dir $fld -inc '*.m3u','*.m3u8' -file|delete-marker

# Далее, вызов функции обработки файлов:
$arr|set-outfile

- но надо учитывать, что плейлисты не всегда составлены верно, где помимо маркера плейлиста могут присутствовать ошибки описанные выше, а кроме того, могут присутствовать и дополнительные теги, например #PLAYLIST или #EXTGRP и т.п. - этот скрипт такие моменты не учитывает и отработает ошибочно на таких плейлистах.
В общем, это уже другая задача, под которую необходимо составить перечень условий, т.е. вычленить все возможные "лишние" теги, которые надо либо удалить, либо просто добавить в строку, например (#EXTINF:-1 group-title="Общие",Евроновости), которая изначально может быть представлена так:
Цитата:

#EXTINF:-1 ,Евроновости
#EXTGRP:Общие
http://evronovosti.mediacdn.ru/sr1/e.../playlist.m3u8
- Нюансов там много и чтобы получить в итоге то, что хотелось бы, придется немного потрудиться и составить таки условия... а здесь Вам могут помочь решить задачу с определенными условиями, но не заниматься экстрасенсорикой в плане того, какие там ещё могут быть подводные течения в тех плейлистах... так что сорри, если что не так. :)

Цитата:

Цитата Alex2010god
Проще было бы батник скрипта сделать »

Если Вам кажется, что это проще - сделайте, но боюсь, что при углублении в тему, Вы будете разочарованы в возможностях командной строки cmd при работе с текстом... :)

Fors1k 08-08-2020 17:58 2930531

Цитата:

Цитата Uragan66
»

Цитата:

Цитата Uragan66
»

Не особо вчитывался в чем тут у вас загвоздка, но вроде как все решается одной строкой.
Код на скорую руку. С задачей, как я понимаю, справляется.
Код:

param(
    $pathIN  = "C:\files\list.txt",
    $pathOUT = "C:\files\list_new.txt"
)cls

$List=((gc $pathIN -raw)|sls "#E[^#]+?(?<=://.+)(?=(`r|$))" -a).Matches.Value|sort -u
$List|out-file $pathOUT

Результат:


Такой ведь нужен?

YuS_2 09-08-2020 07:31 2930565

Цитата:

Цитата Fors1k
Не особо вчитывался в чем тут у вас загвоздка »

А зря... после такого подхода, весь интернет пестрит кривыми плейлистами IPTV и зачастую, тысяч по 20-50 парных строк в них... увы. :)
А если проверить ещё и названия каналов на соответствие того, что в ссылках... там вообще мрак...

Цитата:

Цитата Fors1k
С задачей, как я понимаю, справляется. »

Минимально встречавшиеся кривости (далеко не все возможные, наверное)
Код:

#EXTM3U
#EXTINF:-1 ,0 - FREE-IPTV
/$USB_DIR/sda1/free_ip.m3u
#EXTINF:-1 ,Первый канал
#EXTGRP:Российские
http://gorod.tv/s/live/1/46.252.219.59/1561632042766/0.m3u8
#EXTINF:-1 ,Россия 1
http://gorod.tv/s/live/2/46.252.219.59/1561632042766/0.m3u8
#EXTINF:-1 ,Матч ТВ
http://gorod.tv/s/live/3/46.252.219.59/1561632042766/0.m3u8
#EXTINF:-1 ,НТВ
http://gorod.tv/s/live/4/46.252.219.59/1561632042766/0.m3u8
#EXTINF:-1 ,Пятый канал
http://gorod.tv/s/live/5/46.252.219.59/1561632042766/0.m3u8
Здесь какая-то информация
http://gorod.tv/s/live/1/46.252.219.59/1561632042766/0.m3u8
#EXTINF:-1 ,Пятый канал
#EXTINF:-1 ,Россия К
#EXTGRP:Российские
http://gorod.tv/s/live/6/46.252.219.59/1561632042766/0.m3u8
#EXTINF:-1 ,Москва 24
http://91.231.219.145:80/tv_moscow_24/video.m3u8
#EXTINF:-1 ,Санкт-Петербург
http://91.231.219.145:80/tv_sankt_peterburg/video.m3u8
https://smarttvnews.ru/wp-content/uploads/2018/11/BT-2016-logo_color7890.png
https://smarttvnews.ru/wp-content/uploads/2018/11/BT-2016-logo_color7890.png
#EXTINF:-1 ,Discovery
http://hls-v3-spbtv.msk.spbtv.com/for_spb/msk/ipv3/154.m3u8
#EXTINF:-1 ,NASA TV
http://hls-v3-spbtv.msk.spbtv.com/for_spb/msk/ipv3/17.m3u8
#EXTINF:-1 ,Россия 24
http://gorod.tv/s/live/7/46.252.219.59/1561632042766/0.m3u8
#EXTINF:-1 ,Карусель
http://gorod.tv/s/live/8/46.252.219.59/1561632042766/0.m3u8
#EXTINF:-1 ,Первый канал
#EXTGRP:Российские
http://gorod.tv/s/live/1/46.252.219.59/1561632042766/0.m3u8
#EXTINF:-1 ,Россия 1
http://gorod.tv/s/live/2/46.252.219.59/1561632042766/0.m3u8
#EXTINF:-1 ,Матч ТВ
http://gorod.tv/s/live/3/46.252.219.59/1561632042766/0.m3u8
#EXTINF:-1 ,НТВ
http://gorod.tv/s/live/4/46.252.219.59/1561632042766/0.m3u8
#EXTINF:-1 ,Пятый канал
http://gorod.tv/s/live/5/46.252.219.59/1561632042766/0.m3u8
Здесь какая-то информация
http://gorod.tv/s/live/1/46.252.219.59/1561632042766/0.m3u8
#EXTINF:-1 ,Пятый канал
#EXTINF:-1 ,Россия К
#EXTGRP:Российские
http://gorod.tv/s/live/6/46.252.219.59/1561632042766/0.m3u8
#EXTINF:-1 ,Москва 24
http://91.231.219.145:80/tv_moscow_24/video.m3u8
#EXTINF:-1 ,Санкт-Петербург
http://91.231.219.145:80/tv_sankt_peterburg/video.m3u8
https://smarttvnews.ru/wp-content/uploads/2018/11/BT-2016-logo_color7890.png
https://smarttvnews.ru/wp-content/uploads/2018/11/BT-2016-logo_color7890.png
#EXTINF:-1 ,Discovery
http://hls-v3-spbtv.msk.spbtv.com/for_spb/msk/ipv3/154.m3u8
#EXTINF:-1 ,NASA TV
http://hls-v3-spbtv.msk.spbtv.com/for_spb/msk/ipv3/17.m3u8
#EXTINF:-1 ,Россия 24
http://gorod.tv/s/live/7/46.252.219.59/1561632042766/0.m3u8
#EXTINF:-1 ,Карусель
http://gorod.tv/s/live/8/46.252.219.59/1561632042766/0.m3u8



Должно получится примерно это:
более-менее выправленный лист
Код:

#EXTINF:-1 ,0 - FREE-IPTV
/$USB_DIR/sda1/free_ip.m3u
#EXTINF:-1 ,Discovery
http://hls-v3-spbtv.msk.spbtv.com/for_spb/msk/ipv3/154.m3u8
#EXTINF:-1 ,NASA TV
http://hls-v3-spbtv.msk.spbtv.com/for_spb/msk/ipv3/17.m3u8
#EXTINF:-1 ,Карусель
http://gorod.tv/s/live/8/46.252.219.59/1561632042766/0.m3u8
#EXTINF:-1 ,Матч ТВ
http://gorod.tv/s/live/3/46.252.219.59/1561632042766/0.m3u8
#EXTINF:-1 ,Москва 24
http://91.231.219.145:80/tv_moscow_24/video.m3u8
#EXTINF:-1 ,НТВ
http://gorod.tv/s/live/4/46.252.219.59/1561632042766/0.m3u8
#EXTINF:-1 ,Пятый канал
http://gorod.tv/s/live/5/46.252.219.59/1561632042766/0.m3u8
#EXTINF:-1 ,Россия 1
http://gorod.tv/s/live/2/46.252.219.59/1561632042766/0.m3u8
#EXTINF:-1 ,Россия 24
http://gorod.tv/s/live/7/46.252.219.59/1561632042766/0.m3u8
#EXTINF:-1 ,Санкт-Петербург
http://91.231.219.145:80/tv_sankt_peterburg/video.m3u8
#EXTINF:-1 group-title="Российские",Первый канал
http://gorod.tv/s/live/1/46.252.219.59/1561632042766/0.m3u8
#EXTINF:-1 group-title="Российские",Россия К
http://gorod.tv/s/live/6/46.252.219.59/1561632042766/0.m3u8



Примерный код, возможно неоптимальный. Медленный, но верно работающий... :)
Код:

param (
# Создаем три каталога для работы (в каждом будут находится плейлисты)
        # Путь к каталогу с исходными файлами:
        [string]$infolder = 'D:\in',
        # Путь к каталогу с промежуточными файлами, т.е. исправленные плейлисты с возможными дубликатами:
        [string]$workfolder = 'D:\work',
        # Путь к каталогу с целевыми файлами без дубликатов:
        [string]$outfolder = 'D:\out',
        # Фильтр для отбора файлов:
        [string[]]$filter = ('*.m3u','*.m3u8')
)
function set-groupchannel {
        # Выправляем кривые плейлисты. Всё лишнее будет удалено, только группы #EXTGRP добавляются в строку #EXTINF
        process{
                $arr = new-object system.collections.generic.list[system.string]
                $fout = $fldwrk.fullname + '\' + $_.name
                gc $_.fullname -enc utf8|%{
                        if($_ -match '^#extgrp'){
                                $rep = $_ -replace '#extgrp:'
                                if ($arr.length -gt 0){
                                        if ($arr[-1] -match '^#extinf' -and $arr[-1] -notmatch 'group-title'){
                                                $arr[-1] = $arr[-1] -replace '(?<=#extinf:\s*-?\d+)([^,]*),'," group-title=`"$rep`"$1,"
                                        }
                                }
                        } elseif ($_ -match '^#extinf') {
                                if ($arr.length -gt 0){
                                        if($arr[-1] -match '^#extinf'){
                                                $arr[-1] = $_
                                        } else {$arr.add($_)}
                                } else {$arr.add($_)}
                        } elseif ($_ -notmatch '^#'){
                                if($arr.length -gt 0){
                                        if($arr[-1] -match '^#extinf'){
                                                $arr.add($_)
                                        }
                                }
                        }
                }
                $arr|out-file $fout -enc utf8
        }
}

function set-outfile {
        # Удаляем дубликаты пар строк с одновременной сортировкой этих пар
        process{
                $out = $fldout.fullname + '\' + $_.name
                gc $_.fullname -r 2 -enc utf8|sort -uni|out-file $out -enc utf8
        }
}

if (!(test-path $workfolder)){md $workfolder}
if (!(test-path $outfolder)){md $outfolder}
$fldin = gi $infolder
$fldwrk = gi $workfolder
$fldout = gi $outfolder

# Исправляем плейлисты:
dir ($fldin.fullname + '\*') -inc $filter -file|set-groupchannel
# Удаляем дубликаты и сортируем:
dir ($fldwrk.fullname + '\*') -inc $filter -file|set-outfile


Fors1k 10-08-2020 22:54 2930727

Цитата:

Цитата YuS_2
плейлистами IPTV »

Я, честно говоря, даже не знаю что это такое)
У всех интернет-провайдеров же цифровое тв практически бесплатно, так что не довелось столкнуться с iptv.
Цитата:

Цитата YuS_2
Минимально встречавшиеся кривости (далеко не все возможные, наверное) »

Тут тоже самое, только еще какой-то #EXTGRP появился. Можно и его наличие учесть:
Код:

param(
    $pathIN  = "C:\files\list.txt",
    $pathOUT = "C:\files\list_new.txt"
)cls

$List=((Get-Content $pathIN -raw) -replace "(`r`n#EXTGRP:)((?<=#EXTGRP:)[^`r]+)" , ' ($2)'|
      sls "#E[^#]+?(\.m3u.?|:\d{4})(?=`r|$)"-A).Matches.Value|sort {($_-split"`r`n")[1]} -u
$List|out-file $pathOUT

Теперь работает для всех трех примеров.
В общем интересно было поискать уникальные пары, а в самих плейлистах не шарю)

YuS_2 11-08-2020 09:10 2930748

Цитата:

Цитата Fors1k
Я, честно говоря, даже не знаю что это такое) »

Ну, в принципе, жесткого стандарта, наверное и не существует. Изначально это были плейлисты для музыкальных проигрывателей, а со временем их приспособили и для видеоплееров... и в этом, как раз, содержится вся проблема.
m3u

Цитата:

Цитата Fors1k
У всех интернет-провайдеров же цифровое тв практически бесплатно, так что не довелось столкнуться с iptv. »

Провайдеры - они все разные. Разное количество каналов предлагают, т.е. могут присутствовать не все которые хотелось бы видеть, к тому же, не все предлагают их бесплатно... в общем, это тема отдельного разговора...

Цитата:

Цитата Fors1k
Тут тоже самое, только еще какой-то #EXTGRP появился. »

Проблема в том, что там может и не такое появиться. Каждый плеер может что-то свое добавить и в этом беда... более-менее стандартно, поддерживаются всеми плеерами только две строки #EXTINF плюс ссылка (формат которых тоже может быть разным), именно поэтому листы пытаются привести к такому виду и обрабатывать пары строк.
Вот, валидный и дополненный пример из поста выше:
Пример...
Код:

#EXTM3U url-tvg="http://server/jtv.zip" cache=500 deinterlace=1 aspect-ratio=4:3 croppadd=10x10 tvg-shift=0
#EXTINF:-1 ,0 - FREE-IPTV
/$USB_DIR/sda1/free_ip.m3u
#EXTINF:-1 ,Первый канал
#EXTGRP:Российские
http://gorod.tv/s/live/1/46.252.219.59/1561632042766/0.m3u8
#EXTINF:-1 ,Россия 1
http://gorod.tv/s/live/2/46.252.219.59/1561632042766/0.m3u8
#EXTINF:-1 ,Матч ТВ
http://gorod.tv/s/live/3/46.252.219.59/1561632042766/0.m3u8
#EXTINF:-1 ,НТВ
http://gorod.tv/s/live/4/46.252.219.59/1561632042766/0.m3u8
#EXTINF:-1 ,Пятый канал
http://gorod.tv/s/live/5/46.252.219.59/1561632042766/0.m3u8
Здесь какая-то информация
http://gorod.tv/s/live/1/46.252.219.59/1561632042766/0.m3u8
#EXTINF:-1 ,Пятый канал
#EXTINF:-1 ,Россия К
#EXTGRP:Российские
http://gorod.tv/s/live/6/46.252.219.59/1561632042766/0.m3u8
#EXTINF:-1 ,Москва 24
#EXTVLCOPT:http-user-agent=smartlabs
http://91.231.219.145:80/tv_moscow_24/video.m3u8
#EXTINF:-1 ,Санкт-Петербург
http://91.231.219.145:80/tv_sankt_peterburg/video.m3u8
https://smarttvnews.ru/wp-content/uploads/2018/11/BT-2016-logo_color7890.png
https://smarttvnews.ru/wp-content/uploads/2018/11/BT-2016-logo_color7890.png
#EXTINF:-1 ,Discovery
http://hls-v3-spbtv.msk.spbtv.com/for_spb/msk/ipv3/154.m3u8
#EXTINF:-1 ,NASA TV
http://hls-v3-spbtv.msk.spbtv.com/for_spb/msk/ipv3/17.m3u8
#EXTINF:-1 ,Россия 24
http://gorod.tv/s/live/7/46.252.219.59/1561632042766/0.m3u8
#EXTINF:-1 ,Карусель
http://gorod.tv/s/live/8/46.252.219.59/1561632042766/0.m3u8
#EXTINF:-1 ,Первый канал
#EXTGRP:Российские
http://gorod.tv/s/live/1/46.252.219.59/1561632042766/0.m3u8
#EXTINF:-1 ,Россия 1
http://gorod.tv/s/live/2/46.252.219.59/1561632042766/0.m3u8
#EXTINF:-1 ,Матч ТВ
http://gorod.tv/s/live/3/46.252.219.59/1561632042766/0.m3u8
#EXTINF:-1 ,НТВ
http://gorod.tv/s/live/4/46.252.219.59/1561632042766/0.m3u8
#EXTINF:-1 ,Пятый канал
http://gorod.tv/s/live/5/46.252.219.59/1561632042766/0.m3u8
Здесь какая-то информация
http://gorod.tv/s/live/1/46.252.219.59/1561632042766/0.m3u8
#EXTINF:-1 ,Пятый канал
#EXTINF:-1 ,Россия К
#EXTGRP:Российские
#EXTVLCOPT:http-user-agent=smartlabs
http://gorod.tv/s/live/6/46.252.219.59/1561632042766/0.m3u8
#EXTINF:-1 ,Москва 24
http://91.231.219.145:80/tv_moscow_24/video.m3u8
#EXTINF:-1 ,Санкт-Петербург
http://91.231.219.145:80/tv_sankt_peterburg/video.m3u8
https://smarttvnews.ru/wp-content/uploads/2018/11/BT-2016-logo_color7890.png
https://smarttvnews.ru/wp-content/uploads/2018/11/BT-2016-logo_color7890.png
#EXTINF:-1 ,Discovery
http://hls-v3-spbtv.msk.spbtv.com/for_spb/msk/ipv3/154.m3u8
#EXTINF:-1 ,NASA TV
http://hls-v3-spbtv.msk.spbtv.com/for_spb/msk/ipv3/17.m3u8
#EXTINF:-1 ,Россия 24
http://gorod.tv/s/live/7/46.252.219.59/1561632042766/0.m3u8
#EXTINF:-1 ,Карусель
http://gorod.tv/s/live/8/46.252.219.59/1561632042766/0.m3u8


Цитата:

Цитата Fors1k
Теперь работает для всех трех примеров. »

Увы и ах... не совсем верно работает...
И кстати, сортировку лучше не по ссылкам делать, ибо часто меняются, а по наименованиям каналов.

Fors1k 11-08-2020 18:00 2930848

Цитата:

Цитата YuS_2
Провайдеры - они все разные. »

Да их же всего-то три штуки: Билайн, МТС, Мегафон. ТВ дают бесплатно.
Цитата:

Цитата YuS_2
может и не такое появиться. Пример... »

Код:

param(
    $pathIN  = "C:\files\list.txt",
    $pathOUT = "C:\files\list_new.txt"
)cls

$List=((Get-Content $pathIN -Raw) -replace "#EXT[^I].+?`r`n",''|
      sls "#E[^#]+?(\.m3u.?|:\d{4})(?=`r|$)"-All).Matches.Value|
      sort{($_-split"`r`n")[1]} -u| sort{($_-split"`r`n")[0]} -u
$List|out-file $pathOUT

List4-OUT
Код:

#EXTINF:-1 ,0 - FREE-IPTV
/$USB_DIR/sda1/free_ip.m3u
#EXTINF:-1 ,Discovery
http://hls-v3-spbtv.msk.spbtv.com/for_spb/msk/ipv3/154.m3u8
#EXTINF:-1 ,NASA TV
http://hls-v3-spbtv.msk.spbtv.com/for_spb/msk/ipv3/17.m3u8
#EXTINF:-1 ,Карусель
http://gorod.tv/s/live/8/46.252.219.59/1561632042766/0.m3u8
#EXTINF:-1 ,Матч ТВ
http://gorod.tv/s/live/3/46.252.219.59/1561632042766/0.m3u8
#EXTINF:-1 ,Москва 24
http://91.231.219.145:80/tv_moscow_24/video.m3u8
#EXTINF:-1 ,НТВ
http://gorod.tv/s/live/4/46.252.219.59/1561632042766/0.m3u8
#EXTINF:-1 ,Первый канал
http://gorod.tv/s/live/1/46.252.219.59/1561632042766/0.m3u8
#EXTINF:-1 ,Пятый канал
http://gorod.tv/s/live/5/46.252.219.59/1561632042766/0.m3u8
#EXTINF:-1 ,Россия 1
http://gorod.tv/s/live/2/46.252.219.59/1561632042766/0.m3u8
#EXTINF:-1 ,Россия 24
http://gorod.tv/s/live/7/46.252.219.59/1561632042766/0.m3u8
#EXTINF:-1 ,Россия К
http://gorod.tv/s/live/6/46.252.219.59/1561632042766/0.m3u8
#EXTINF:-1 ,Санкт-Петербург
http://91.231.219.145:80/tv_sankt_peterburg/video.m3u8


Цитата:

Цитата YuS_2
И кстати, сортировку лучше не по ссылкам делать, ибо часто меняются, а по наименованиям каналов. »

Если делать сортировку по именам каналов, то в List1 получим 2 канала "Киев". Если по ссылкам, то получим 2 канала "Украина".
Так что, видимо, надо сортировать по обоим параметрам. Теперь, по идее, будет работать для любых примеров.

Uragan66 11-08-2020 20:23 2930867

Цитата:

Цитата Fors1k
Да их же всего-то три штуки: Билайн, МТС, Мегафон. ТВ дают бесплатно »

Fors1k, провайдеров IPTV ну очень много... Есть официальные, есть просто рестримеры. Платные и бесплатные.
Многие провайдеры интернета предоставляют своим пользователям и бесплатное ТВ по мультикасту.
Нюансов там очень много, но тема не об этом...
Sorry за оффтоп

Uragan66 16-08-2020 09:17 2931355

Цитата:

Цитата YuS_2
И кстати, сортировку лучше не по ссылкам делать, ибо часто меняются, а по наименованиям каналов »

Сортировка по наименованию канала конечно лучше выглядит, как по визуальному восприятию, так и при поиске определённого канала в плеере.
Но как сделать сортировку по имени канала, если в строке перед названием канала есть дополнительные директивы, к примеру:
Код:

#EXTINF:0 group-title="Русские" tvg-id="rossia1" tvg-logo="https://pbs.twimg.com/media/DxnvslfWsAE6Sys.png",Россия 1 HD
https://meta.vcdn.biz/30560520b9dacb6e03aae2bc57bd8d78_megogo/vod/fs/o/41139221/u_sid/0/u_uid/0/u_vod/0/u_device/cms_html5/u_srvc/28561/type.live/playlist.m3u8
#EXTINF:0 group-title="Русские" tvg-id="5kanal-ru" tvg-logo="https://pbs.twimg.com/media/DxnwycUX4AAaKJp.png",Пятый канал
https://meta.vcdn.biz/bd7779421f9ce7a23453cb0fb05987a9_megogo/vod/fs/o/36429601/u_sid/0/u_uid/0/u_vod/0/u_device/cms_html5/u_srvc/28561/type.live/playlist.m3u8
#EXTINF:0 group-title="Русские" tvg-id="mir-premium" tvg-logo="https://pbs.twimg.com/media/DxnzHGTWsAMs6Cd.png",Мир Premium HD
https://meta.vcdn.biz/7cb30d763564c992476e35512340ec89_megogo/vod/fs/o/28401691/u_sid/0/u_uid/0/u_vod/0/u_device/cms_html5/u_srvc/28561/type.live/playlist.m3u8
#EXTINF:0 group-title="Русские" tvg-id="otr" tvg-logo="https://pbs.twimg.com/media/DxnzY6kWsAESz3i.png",ОТР
https://meta.vcdn.biz/6702b90d26a9893506c499d0af1d6a58_megogo/vod/fs/o/41139191/u_sid/0/u_uid/0/u_vod/0/u_device/cms_html5/u_srvc/28561/type.live/playlist.m3u8
#EXTINF:0 group-title="Русские" tvg-id="piatnica" tvg-logo="https://pbs.twimg.com/media/Dxnx_cSWsAETWIm.png",Пятница!
https://meta.vcdn.biz/5b39f9d7689deb889ec1ee82c2c05328_megogo/vod/fs/o/16283521/u_sid/0/u_uid/0/u_vod/0/u_device/cms_html5/u_srvc/28561/type.live/playlist.m3u8
#EXTINF:0 group-title="Русские" tvg-id="match-tv" tvg-logo="https://pbs.twimg.com/media/Dxnv4yWW0AArM1C.png",Матч ТВ
https://meta.vcdn.biz/fb2879b1db7b9774b142918ea4521488_megogo/vod/fs/o/36426601/u_sid/0/u_uid/0/u_vod/0/u_device/cms_html5/u_srvc/28561/type.live/playlist.m3u8
#EXTINF:0 group-title="Русские" tvg-id="tnt" tvg-logo="https://pbs.twimg.com/media/DxnwsTmWoAA5iYu.png",ТНТ
https://meta.vcdn.biz/1ff4118dc0fefcbd3ce5ae5fdf2fc482_megogo/vod/fs/o/40500701/u_sid/0/u_uid/0/u_vod/0/u_device/cms_html5/u_srvc/28561/type.live/playlist.m3u8

как отсортировать, чтобы получить:
Код:

#EXTINF:0 group-title="Русские" tvg-id="match-tv" tvg-logo="https://pbs.twimg.com/media/Dxnv4yWW0AArM1C.png",Матч ТВ
https://meta.vcdn.biz/fb2879b1db7b9774b142918ea4521488_megogo/vod/fs/o/36426601/u_sid/0/u_uid/0/u_vod/0/u_device/cms_html5/u_srvc/28561/type.live/playlist.m3u8
#EXTINF:0 group-title="Русские" tvg-id="mir-premium" tvg-logo="https://pbs.twimg.com/media/DxnzHGTWsAMs6Cd.png",Мир Premium HD
https://meta.vcdn.biz/7cb30d763564c992476e35512340ec89_megogo/vod/fs/o/28401691/u_sid/0/u_uid/0/u_vod/0/u_device/cms_html5/u_srvc/28561/type.live/playlist.m3u8
#EXTINF:0 group-title="Русские" tvg-id="otr" tvg-logo="https://pbs.twimg.com/media/DxnzY6kWsAESz3i.png",ОТР
https://meta.vcdn.biz/6702b90d26a9893506c499d0af1d6a58_megogo/vod/fs/o/41139191/u_sid/0/u_uid/0/u_vod/0/u_device/cms_html5/u_srvc/28561/type.live/playlist.m3u8
#EXTINF:0 group-title="Русские" tvg-id="piatnica" tvg-logo="https://pbs.twimg.com/media/Dxnx_cSWsAETWIm.png",Пятница!
https://meta.vcdn.biz/5b39f9d7689deb889ec1ee82c2c05328_megogo/vod/fs/o/16283521/u_sid/0/u_uid/0/u_vod/0/u_device/cms_html5/u_srvc/28561/type.live/playlist.m3u8
#EXTINF:0 group-title="Русские" tvg-id="5kanal-ru" tvg-logo="https://pbs.twimg.com/media/DxnwycUX4AAaKJp.png",Пятый канал
https://meta.vcdn.biz/bd7779421f9ce7a23453cb0fb05987a9_megogo/vod/fs/o/36429601/u_sid/0/u_uid/0/u_vod/0/u_device/cms_html5/u_srvc/28561/type.live/playlist.m3u8
#EXTINF:0 group-title="Русские" tvg-id="rossia1" tvg-logo="https://pbs.twimg.com/media/DxnvslfWsAE6Sys.png",Россия 1 HD
https://meta.vcdn.biz/30560520b9dacb6e03aae2bc57bd8d78_megogo/vod/fs/o/41139221/u_sid/0/u_uid/0/u_vod/0/u_device/cms_html5/u_srvc/28561/type.live/playlist.m3u8
#EXTINF:0 group-title="Русские" tvg-id="tnt" tvg-logo="https://pbs.twimg.com/media/DxnwsTmWoAA5iYu.png",ТНТ
https://meta.vcdn.biz/1ff4118dc0fefcbd3ce5ae5fdf2fc482_megogo/vod/fs/o/40500701/u_sid/0/u_uid/0/u_vod/0/u_device/cms_html5/u_srvc/28561/type.live/playlist.m3u8

Пытался когда-то сделать такую сортировку, но не получилось...

Fors1k 16-08-2020 11:32 2931361

Код:

param(
    $path = "C:\files\list.txt"
)cls

gc $path -re 2|sort{($_|sls ',.+').Matches.Value}


Foreigner 16-08-2020 11:43 2931363

Код:

Get-Content 1.m3u -ReadCount 2 | Sort-Object { $_[0].Split(',')[1] }

Uragan66 16-08-2020 14:16 2931380

Fors1k, к сожалению, Ваш код не подходит для плейлистов, где в обязательном порядке должны считываться по две строки (строка с именем канала и ссылка). Код, предложенный Вами, их перекручивает.
Foreigner, Ваш код строки не перекручивает, но и алфавитной сортировки, именно по имени канала, не возвращает.

Fors1k 16-08-2020 14:26 2931383

Только что запустил код. И мой, и от Foreigner выдает результат, который вы предоставили, как ожидаемый.

Uragan66 16-08-2020 14:39 2931384

Fors1k, да, действительно... мои извинения. Пример просто немного неудачный представил.
Но и первый и второй код будет работать только с "чистыми" строками. Если будет, к примеру, директива объявления плейлиста #EXTM3U (самой первой строкой), то скрипты сработают как я выше написал.
Попробую после удаления дубликатов запустить.
Спасибо!

Fors1k 16-08-2020 14:53 2931386

Цитата:

Цитата Uragan66
будет работать только с "чистыми" строками. »

Код:

param(
    $pathIN  = "C:\files\list.txt",
    $pathOUT = "C:\files\list_new.txt"
)cls

$List=((Get-Content $pathIN -Raw) -replace "#EXT[^I].+?`r`n",''|
      sls "#E[^#]+?(\.m3u.?|:\d{4})(?=`r|$)"-All).Matches.Value|
      sort{($_-split"`r`n")[1]} -u|sort{($_-split"`r`n")[0]} -u|
      sort{($_-split"`r`n").split(',')[1]}
$List|out-file $pathOUT


Uragan66 16-08-2020 15:17 2931389

Fors1k, этот код я пробовал раньше... К сожалению, он работает неправильно.
К примеру, возьмите плейлист:
Плейлист
Код:

#EXTM3U
#EXTINF:-1,A1
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s45/04.m3u8
#EXTINF:-1,A2
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s33/04.m3u8
#EXTINF:-1,Fine Living
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s51/04.m3u8
#EXTINF:-1,Bridge TV
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s34/04.m3u8
#EXTINF:-1,Bridge TV Русский хит
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s78/04.m3u8
#EXTINF:-1,Fine Living
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s51/04.m3u8
#EXTINF:-1,Food Network
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s18/04.m3u8
#EXTINF:-1,MCM TOP
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s49/04.m3u8
#EXTINF:-1,Ocean TV
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s84/04.m3u8
#EXTINF:-1,RTG TV
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s80/04.m3u8
#EXTINF:-1,TV 1000
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s90/04.m3u8
#EXTINF:-1,TV 1000 Action
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s91/04.m3u8
#EXTINF:-1,Ocean TV
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s84/04.m3u8
#EXTINF:-1,TV 1000 Русское кино
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s95/04.m3u8
#EXTINF:-1,TV5 Monde Europe
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s75/04.m3u8
#EXTINF:-1,Tiji
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s59/04.m3u8
#EXTINF:-1,Viasat Explore
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s72/04.m3u8
#EXTINF:-1,Viasat History
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s70/04.m3u8
#EXTINF:-1,Viasat Nature
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s67/04.m3u8
#EXTINF:-1,Доктор
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s76/04.m3u8
#EXTINF:-1,Загородный
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s31/04.m3u8
#EXTINF:-1,Звезда
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s85/04.m3u8
#EXTINF:-1,Канал Disney
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s60/04.m3u8
#EXTINF:-1,Мама
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s77/04.m3u8
#EXTINF:-1,Мир http://zona-iptv.ru/
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s39/04.m3u8
#EXTINF:-1,Муз ТВ
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s28/04.m3u8
#EXTINF:-1,Мульт
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s58/04.m3u8
#EXTINF:-1,НСТ
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s87/04.m3u8
#EXTINF:-1,Premium1
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s83/04.m3u8
#EXTINF:-1,shanson
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s43/04.m3u8
#EXTINF:-1,ЭВРИКА
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s44/04.m3u8
#EXTINF:-1,АРМЕНИЯ ТВ5
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s46/04.m3u8
#EXTINF:-1,RTD
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s93/04.m3u8
#EXTINF:-1,ЗОО ТВ
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s92/04.m3u8
#EXTINF:-1,ЕВРОНОВОСТИ
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s89/04.m3u8
#EXTINF:-1,ДОМАШНИЙ
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s88/04.m3u8
#EXTINF:-1,SENTANA SPORT+
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s82/04.m3u8
#EXTINF:-1,SENTANA SPORT
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s81/04.m3u8
#EXTINF:-1,Euronews
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s79/04.m3u8
#EXTINF:-1,Atv
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s74/04.m3u8
#EXTINF:-1,73
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s73/04.m3u8
#EXTINF:-1,Телепутишествия
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s71/04.m3u8
#EXTINF:-1,69
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s69/04.m3u8
#EXTINF:-1,А HBO
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s64/04.m3u8
#EXTINF:-1,RTG HD
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s63/04.m3u8
#EXTINF:-1,ОХОТНИК И РЫБОЛОВ HD
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s62/04.m3u8
#EXTINF:-1,ОХОТНИК И РЫБОЛОВ
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s55/04.m3u8
#EXTINF:-1,ТВЦ
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s54/04.m3u8
#EXTINF:-1,53
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s53/04.m3u8
#EXTINF:-1,ПЯТНИЦА
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s50/04.m3u8
#EXTINF:-1,A1
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s45/03.m3u8
#EXTINF:-1,A2
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s33/03.m3u8
#EXTINF:-1,Bridge TV
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s34/03.m3u8
#EXTINF:-1,Bridge TV Русский хит
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s78/03.m3u8
#EXTINF:-1,Fine Living
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s51/03.m3u8
#EXTINF:-1,Food Network
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s18/03.m3u8
#EXTINF:-1,MCM TOP
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s49/03.m3u8
#EXTINF:-1,Ocean TV
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s84/03.m3u8
#EXTINF:-1,RTG TV
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s80/03.m3u8
#EXTINF:-1,TV 1000
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s90/03.m3u8
#EXTINF:-1,TV 1000 Action
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s91/03.m3u8
#EXTINF:-1,TV 1000 Русское кино
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s95/03.m3u8
#EXTINF:-1,TV5 Monde Europe
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s75/03.m3u8
#EXTINF:-1,Tiji
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s59/03.m3u8
#EXTINF:-1,Viasat Explore
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s72/03.m3u8
#EXTINF:-1,Viasat History
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s70/03.m3u8
#EXTINF:-1,Viasat Nature
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s67/03.m3u8
#EXTINF:-1,Доктор
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s76/03.m3u8
#EXTINF:-1,Загородный
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s31/03.m3u8
#EXTINF:-1,Звезда
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s85/03.m3u8
#EXTINF:-1,Канал Disney
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s60/03.m3u8
#EXTINF:-1,Мама
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s77/03.m3u8
#EXTINF:-1,Мир
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s39/03.m3u8
#EXTINF:-1,Муз ТВ
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s28/03.m3u8
#EXTINF:-1,Мульт
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s58/03.m3u8
#EXTINF:-1,НСТ
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s87/03.m3u8
#EXTINF:-1,Наука
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s98/03.m3u8
#EXTINF:-1,Россия 24
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s21/03.m3u8
#EXTINF:-1,Русский Бестселлер
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s52/03.m3u8
#EXTINF:-1,Русский Экстрим
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s47/03.m3u8
#EXTINF:-1,Рыжий
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s57/03.m3u8
#EXTINF:-1,Сарафан
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s38/03.m3u8
#EXTINF:-1,ТНТ4 http://zona-iptv.ru/
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s100/03.m3u8
#EXTINF:-1,Телекафе
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s56/03.m3u8
#EXTINF:-1,Техно 24
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s68/03.m3u8
#EXTINF:-1,VIP COMEDY
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s97/03.m3u8
#EXTINF:-1,ПРИКЛЮЧЕНИЯ HD
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s99/03.m3u8
#EXTINF:-1,Cineman
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s66/03.m3u8
#EXTINF:-1,Filmzone ATV
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s48/03.m3u8
#EXTINF:-1,Kinoman ATV
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s94/03.m3u8
#EXTINF:-1,Premium1
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s83/03.m3u8
#EXTINF:-1,shanson
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s43/03.m3u8
#EXTINF:-1,ЭВРИКА
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s44/03.m3u8
#EXTINF:-1,АРМЕНИЯ ТВ5
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s46/03.m3u8
#EXTINF:-1,RTD
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s93/03.m3u8
#EXTINF:-1,ЗОО ТВ
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s92/03.m3u8
#EXTINF:-1,ЕВРОНОВОСТИ
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s89/03.m3u8
#EXTINF:-1,ДОМАШНИЙ
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s88/03.m3u8
#EXTINF:-1,SENTANA SPORT
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s82/03.m3u8
#EXTINF:-1,SENTANA SPORT
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s81/03.m3u8
#EXTINF:-1,Euronews
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s79/03.m3u8
#EXTINF:-1,Atv
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s74/03.m3u8
#EXTINF:-1,73
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s73/03.m3u8
#EXTINF:-1,Телепутишествия
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s71/03.m3u8
#EXTINF:-1,69
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s69/03.m3u8
#EXTINF:-1,А HBO
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s64/03.m3u8
#EXTINF:-1,RTG HD
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s63/03.m3u8
#EXTINF:-1,ОХОТНИК И РЫБОЛОВ HD
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s62/03.m3u8
#EXTINF:-1,ОХОТНИК И РЫБОЛОВ
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s55/03.m3u8
#EXTINF:-1,ТВЦ
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s54/03.m3u8
#EXTINF:-1,53
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s53/03.m3u8
#EXTINF:-1,ПЯТНИЦА
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s50/03.m3u8
#EXTINF:-1,A1
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s45/01.m3u8
#EXTINF:-1,A2
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s33/01.m3u8
#EXTINF:-1,Bridge TV
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s34/01.m3u8
#EXTINF:-1,Bridge TV Русский хит
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s78/01.m3u8
#EXTINF:-1,Fine Living
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s51/01.m3u8
#EXTINF:-1,Food Network
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s18/01.m3u8
#EXTINF:-1,MCM TOP
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s49/01.m3u8
#EXTINF:-1,Ocean TV
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s84/01.m3u8
#EXTINF:-1,RTG TV
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s80/01.m3u8
#EXTINF:-1,TV 1000
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s90/01.m3u8
#EXTINF:-1,TV 1000 Action
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s91/01.m3u8
#EXTINF:-1,Звезда
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s85/01.m3u8


В нём несколько вхождений каналов с одинаковыми именами, но с разными ссылками (к примеру - #EXTINF:-1,A1). Они должны все остаться в листе, но Ваш код оставляет только одно вхождение.
К тому же удаляются нужные строки с директивой #EXTVLCOPT.

Fors1k 16-08-2020 15:37 2931390

Цитата:

Цитата Uragan66
В нём несколько вхождений каналов с одинаковыми именами, но с разными ссылками »

Yus_2 говорил, что нужно проверять уникальность только имен. Теперь выясняется, что нужно проверять уникальность ссылок(как я изначально и делал).
Цитата:

Цитата Uragan66
К тому же удаляются нужные строки с директивой #EXTVLCOPT. »

Ранее говорилось, что нужно сделать так, что бы в плейлисте остались только пары вида
#EXTINF:-1,Bridge TV
http://ott-cdn.ucom.am/s33/04.m3u8

Покажите как должен в итоге выглядеть этот пример.

Похоже, все-таки нужо оставить мне эту затею, так как каждый раз условия конечного результата разные :)

Foreigner 16-08-2020 16:08 2931393

Попробуйте так, особо не тестировал, но вроде сортирует
Код:

[hashtable[]] $channels =
    Get-Content list.txt | Select-String '#EXTINF:.+' -Context 2 |
        ForEach-Object { @{ Channel = $_.Matches.Value; Context = $_.Context.PostContext }}

$(
'#EXTM3U'
$channels | Sort-Object { $_.Channel } | ForEach-Object { $_.Channel; $_.Context }

) | Set-Content sorted_list.txt


Uragan66 16-08-2020 16:45 2931399

Цитата:

Цитата Fors1k
Покажите как должен в итоге выглядеть этот пример »

Fors1k, листов в сети множество и все по-разному составлены. Если плейлист от провайдера или толкового рестримера, то в нём практически и не нужно удалять дубликаты. А если это плейлист от юзеров, среди которых попадаются и совсем "криворукие", то в нём может быть всё что угодно (в разумных пределах конечно).
К примеру может быть такой плейлист:
in_list
Код:

#EXTM3U
#EXTINF:-1,A1
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s45/04.m3u8
#EXTINF:-1,A2
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s33/04.m3u8
#EXTINF:-1,Новий канал
#EXTGRP:Украина
http://iptv.prosto.tv:7000/ch6/video.m3u8?secret=co9yg1i4
#EXTINF:-1,A1
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s45/01.m3u8
#EXTINF:0,Первый канал
http://gorod.tv/s/live/1/46.173.58.40/1544264103816/0.m3u8
#EXTINF:0,Россия 1 HD
https://meta.vcdn.biz/30560520b9dacb6e03aae2bc57bd8d78_megogo/vod/fs/o/41139221/u_sid/0/u_uid/0/u_vod/0/u_device/cms_html5/u_srvc/28561/type.live/playlist.m3u8
#EXTINF:0,5-тый канал
https://meta.vcdn.biz/bd7779421f9ce7a23453cb0fb05987a9_megogo/vod/fs/o/36429601/u_sid/0/u_uid/0/u_vod/0/u_device/cms_html5/u_srvc/28561/type.live/playlist.m3u8
#EXTINF:0,Первый
http://gorod.tv/s/live/1/46.173.58.40/1544264103816/0.m3u8
#EXTINF:0 group-title="Русские" tvg-id="zvezda" tvg-logo="https://pbs.twimg.com/media/DxnzMctXcAEPuMv.png",Звезда
https://meta.vcdn.biz/a90e6e1d617148ec8b087bae57dd3338_megogo/vod/fs/o/36429631/u_sid/0/u_uid/0/u_vod/0/u_device/cms_html5/u_srvc/28561/type.live/playlist.m3u8
#EXTINF:2.97077,Кинозал 2
http://cooltv.dyndns.tv:8200/udp/239.255.4.30:1234
#EXTINF:-1,СТБ
#EXTGRP:Украина
http://iptv.prosto.tv:7000/ch8/video.m3u8?secret=co9yg1i4
#EXTINF:1.87832,Кинозал 3
http://cooltv.dyndns.tv:8200/udp/239.255.4.31:1234
#EXTINF:0 group-title="Русские" tvg-id="rossia1" tvg-logo="https://pbs.twimg.com/media/DxnvslfWsAE6Sys.png",Россия 1 HD
https://meta.vcdn.biz/ret9421f9ce7a23453cb0fb05987a9_megogo/vod/fs/o/36429601/u_sid/0/u_uid/0/u_vod/0/u_device/cms_html5/u_srvc/28561/type.live/playlist.m3u8
#EXTINF:-1,СТБ
#EXTGRP:Украина
http://iptv.prosto.tv:7000/ch5/video.m3u8?secret=co9yg1i4
#EXTINF:-1,Новий канал
#EXTGRP:Украина
http://iptv.prosto.tv:7000/ch6/video.m3u8?secret=co9yg1i4
#EXTINF:0,Первый канал
http://gorod.tv/s/live/1/46.173.58.40/1544264103816/0.m3u8
#EXTINF:-1, 5 канал
#EXTGRP:Украина
http://iptv.prosto.tv:7000/ch7/video.m3u8?secret=co9yg1i4


В идеале на выходе должны получить:
out_list
Код:

#EXTM3U
#EXTINF:0,5-тый канал
https://meta.vcdn.biz/bd7779421f9ce7a23453cb0fb05987a9_megogo/vod/fs/o/36429601/u_sid/0/u_uid/0/u_vod/0/u_device/cms_html5/u_srvc/28561/type.live/playlist.m3u8
#EXTINF:-1, 5 канал
#EXTGRP:Украина
http://iptv.prosto.tv:7000/ch7/video.m3u8?secret=co9yg1i4
#EXTINF:-1,A1
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s45/01.m3u8
#EXTINF:-1,A1
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s45/04.m3u8
#EXTINF:-1,A2
#EXTVLCOPT:http-user-agent=Restream/5.20408.171030 mag250, mag250 SmartSDK/1.5.63-rt-25 Qt/4.7.3 API/0.30.0 Mozilla/5.0
http://ott-cdn.ucom.am/s33/04.m3u8
#EXTINF:0 group-title="Русские" tvg-id="zvezda" tvg-logo="https://pbs.twimg.com/media/DxnzMctXcAEPuMv.png",Звезда
https://meta.vcdn.biz/a90e6e1d617148ec8b087bae57dd3338_megogo/vod/fs/o/36429631/u_sid/0/u_uid/0/u_vod/0/u_device/cms_html5/u_srvc/28561/type.live/playlist.m3u8
#EXTINF:2.97077,Кинозал 2
http://cooltv.dyndns.tv:8200/udp/239.255.4.30:1234
#EXTINF:1.87832,Кинозал 3
http://cooltv.dyndns.tv:8200/udp/239.255.4.31:1234
#EXTINF:-1,Новий канал
#EXTGRP:Украина
http://iptv.prosto.tv:7000/ch6/video.m3u8?secret=co9yg1i4
#EXTINF:0,Первый канал
http://gorod.tv/s/live/1/46.173.58.40/1544264103816/0.m3u8
#EXTINF:0,Россия 1 HD
https://meta.vcdn.biz/30560520b9dacb6e03aae2bc57bd8d78_megogo/vod/fs/o/41139221/u_sid/0/u_uid/0/u_vod/0/u_device/cms_html5/u_srvc/28561/type.live/playlist.m3u8
#EXTINF:0 group-title="Русские" tvg-id="rossia1" tvg-logo="https://pbs.twimg.com/media/DxnvslfWsAE6Sys.png",Россия 1 HD
https://meta.vcdn.biz/ret9421f9ce7a23453cb0fb05987a9_megogo/vod/fs/o/36429601/u_sid/0/u_uid/0/u_vod/0/u_device/cms_html5/u_srvc/28561/type.live/playlist.m3u8
#EXTINF:-1,СТБ
#EXTGRP:Украина
http://iptv.prosto.tv:7000/ch5/video.m3u8?secret=co9yg1i4
#EXTINF:-1,СТБ
#EXTGRP:Украина
http://iptv.prosto.tv:7000/ch8/video.m3u8?secret=co9yg1i4


то есть должны удалиться дубликаты и по именам каналов и по ссылкам на потоки, но при этом структура плейлиста не должна быть нарушена и должны сохраниться директивы #EXTGRP и #EXTVLCOPT

Foreigner, к сожалению Ваш код тоже путает строки.
Ну да ладно... Пока дорабатываю старый рабочий код, просто почитал новые посты в теме и пришла мысль добавить ещё и алфавитную сортировку по имени канала...

YuS_2 18-08-2020 22:33 2931608

Цитата:

Цитата Fors1k
Yus_2 говорил, что нужно проверять уникальность только имен. »

Эмм, где это я такое говорил? :unsure: ;)

Цитата:

Цитата Fors1k
Теперь выясняется, что нужно проверять уникальность ссылок(как я изначально и делал). »

Цитата:

Цитата Fors1k
Ранее говорилось, что нужно сделать так, что бы в плейлисте остались только пары вида »

Ранее я говорил это:
Цитата:

Цитата YuS_2
Создание скрипта, правильно решающего задачу, зависит от правильного составления условий той задачи... »

и это немаловажно... кстати, там ещё была речь не только об ошибках составителей плейлистов...
А поскольку пока были условия в задаче проверять таки только ПАРЫ строк, то и уникальность проверяться должна именно ПАР строк, а сортировка пар по имени канала, либо по ссылке - здесь вторично.

Цитата:

Цитата Fors1k
Похоже, все-таки нужо оставить мне эту затею, так как каждый раз условия конечного результата разные »

А я ведь говорил, что для решения задачи необходимо получить полные условия... ну, или самому окунуться в тему, чтобы понять нюансы. Но если в теме нет надобности, то окунаться в неё - вопрос только желания и свободного времени. :)

Цитата:

Цитата Uragan66
Но как сделать сортировку по имени канала, если в строке перед названием канала есть дополнительные директивы »

Это не проблема, вопрос совсем в другом...
Как и писал выше, необходимы ПОЛНЫЕ условия задачи... а вот это:
Цитата:

Цитата Uragan66
К тому же удаляются нужные строки с директивой #EXTVLCOPT. »

Цитата:

Цитата Uragan66
и должны сохраниться директивы #EXTGRP и #EXTVLCOPT »

- противоречит изначальным условиям задачи, что проверяться должны пары строк... это уже будут не пары, а переменная величина количества проверяемых строк, с неопределенным (пока) массивом строк на выходе, т.е. нет в условиях того, какие строки необходимо сохранять, какие перемещать в строку с тегом #EXTINF, а какие удалять...
Например тег:
Цитата:

Цитата Uragan66
#EXTVLCOPT »

понимает, если не ошибаюсь, только VLC плеер... нужен ли он в плейлистах?
а это:
Цитата:

Цитата Uragan66
#EXTGRP »

- всего лишь группы, по которым компонуются каналы... опять же, такой тег не все плееры понимают, а некоторые и на дух не переносят, т.е. надо не сохранять, а удалять...
Кроме того, этот тег в более универсальном виде, лучше переместить таки в строку #EXTINF...
В общем:
Цитата:

Цитата YuS_2
это уже другая задача, под которую необходимо составить перечень условий, т.е. вычленить все возможные "лишние" теги, которые надо либо удалить, либо просто добавить в строку, например (#EXTINF:-1 group-title="Общие",Евроновости)»

Цитата:

Цитата YuS_2
и чтобы получить в итоге то, что хотелось бы, придется немного потрудиться и составить таки условия... »

Цитата:

Цитата YuS_2
а здесь Вам могут помочь решить задачу с определенными условиями, но не заниматься экстрасенсорикой в плане того, какие там ещё могут быть подводные течения в тех плейлистах... так что сорри, если что не так. »

:)


Время: 19:41.

Время: 19:41.
© OSzone.net 2001-