Войти

Показать полную графическую версию : [решено] удалить лишние ссылки, если имена файлов совпадают


Alexander_88
17-03-2024, 11:32
Здравствуйте, подскажите, как можно удалить лишние ссылки из txt файла. Лишние считаются, если имена файла, игнорируя разрешение совпадает. И такое условие.. если среди лишних ссылок есть та, в имени файла которой расширение mp4, то должна остаться именно эта ссылка, а удалиться та, которая с другим расширением.. А если они все с расширением mp4, то должна остаться только одна.. если нет лишних с mp4, то также должна одна остаться.
Пример:
файл 1.txt
https://k2s.cc/file/c7dert7de8/0301start.mp4
https://k2s.cc/file/579a1wer7c7/0301start.mp4
https://k2s.cc/file/c97ary2a49/0301kino.mp4
https://k2s.cc/file/a2f4bwee2/0301kino.avi
https://k2s.cc/file/3fa267twf730/0301ugol.mp4
https://k2s.cc/file/ab4e4hjef31/0301ugol.avi
https://k2s.cc/file/0161s2edf4a7f/0301ugol.mp4
https://k2s.cc/file/8c504fgj993c/0302krot.mp4
https://k2s.cc/file/b646bf1vd4nb2/0305www.mp4
https://k2s.cc/file/092e70sdf57672/0308rr.mp4
https://k2s.cc/file/fda01cсми6dd/0308ert.mp4
https://k2s.cc/file/273c612выап0/0308ghg.mp4
https://k2s.cc/file/cb4d00ур5ea2/0309гншb.mp4

после применения скрипта, файл 1.txt должен стать таким:
https://k2s.cc/file/579a1wer7c7/0301start.mp4
https://k2s.cc/file/c97ary2a49/0301kino.mp4
https://k2s.cc/file/0161s2edf4a7f/0301ugol.mp4
https://k2s.cc/file/8c504fgj993c/0302krot.mp4
https://k2s.cc/file/b646bf1vd4nb2/0305www.mp4
https://k2s.cc/file/092e70sdf57672/0308rr.mp4
https://k2s.cc/file/fda01cсми6dd/0308ert.mp4
https://k2s.cc/file/273c612выап0/0308ghg.mp4
https://k2s.cc/file/cb4d00ур5ea2/0309гншb.mp4
:)

DJ Mogarych
18-03-2024, 16:34
Powershell

$file = 'C:\Temp\1.txt'

$content = gc $file |
group {$_ -replace '.*/(.+)\..+?$','$1'} |% {
if ($_.count -eq 1) {
$_.group
}
else {
if ($_.group -match 'mp4$') {($_.group -match 'mp4$')[-1]}
else {($_.group)[-1]}
}
}

Set-Content -Path $file -Value $content

Alexander_88
19-03-2024, 09:04
DJ Mogarych, спасибо, проверил на боевом файле, судя по другой программе очистилось больше ссылок, чем показывает программа ссылок с одинаковыми именами файлов (игнорируя расширение). Посмотрел, скрипт удаляет все ссылки (не только лишние), если нету не одной ссылки с mp4. например, если две ссылки с именами.расширениями 0215start.wmv, то они обе удалятся, и ни одной не останется, можно ли сделать, чтобы осталась одна (желательно самая нижняя, если это возможно).
--
Необходимо удалить только лишние (это если имена файла (ИГНОРИРУЯ РАСШИРЕНИЕ) совпадает), т.е. должно остаться по одной ссылки для каждого имени файла.
У mp4 ссылок как бы приоритет:
- если есть лишние ссылки и в них разные расширения, то остается только одна с mp4... если mp4 несколько, остается самая нижняя.
- если есть лишние ссылки, но не в одной нету mp4, то остается только одна, самая нижняя.
- если нету лишних ссылок, то с ссылкой ничего не происходит, не важно какое у ней расширение.

Sham
19-03-2024, 12:22
в .net есть методы всякие разные
gc $file | % {
$uri = [Uri]$_
if (-not $uri.Segments -or -not ($fn = $uri.Segments[-1])) { return }
[pscustomobject]@{
FN = [IO.Path]::GetFileNameWithoutExtension($fn)
E = [IO.Path]::GetExtension($fn)
S = $_
}
} | group FN | % {
[array]$mp4 = $_.Group | ? E -eq '.mp4'
if ($mp4.length) { $mp4[-1].S}
else { $_.Group[-1].S }
} | out-file ($file + '___.txt') -enc default

DJ Mogarych
19-03-2024, 20:56
поправил

Alexander_88
21-03-2024, 07:27
спасибо, оба скрипта работают, все как хотел :)




© OSzone.net 2001-2012