Powershell удалить дубликаты строки имеет начало того же другого - PullRequest
0 голосов
/ 29 апреля 2020

в powershell Я хотел бы удалить повторяющуюся строку в текстовом файле, когда они начинаются аналогично:

https://mysite.local/9999/9999_01_00.jpg?Watchout=1588338564&User=oj-e39DOyiUJCjtG3E2DWaeT8Q8_&dominus=3PK5GF6789
https://mysite.local/9999/9999_01_01.jpg?Watchout=1182344561&User=EjHBJ-biGSlM-ewPMVs_&dominus=3PK5GF6789
https://mysite.local/9999/9999_01_01.jpg?Watchout=1182344561&User=EjHBJ-biGSlM-ewPMVs_&dominus=3PK5GF6789
https://mysite.local/9999/9999_01_01.jpg?Watchout=1182344561&User=EjHBJ-biGSlM-ewPMVs_&dominus=3PK5GF6789
https://mysite.local/9999/9999_01_02.jpg?Watchout=1182344561&User=IPElkKyuulUYY1AL~~y4Y-HedKarGntAexw14_&dominus=3PK5GF6789
https://mysite.local/9999/9999_01_02.jpg?Watchout=1182344561&User=IPElkKyuulUYY1AL~~y4Y-HedKarGntAexw14_&dominus=3PK5GF6789
https://mysite.local/9999/9999_01_02.jpg?Watchout=1182344561&User=IPElkKyuulUYY1AL~~y4Y-HedKarGntAexw14_&dominus=3PK5GF6789
https://mysite.local/9999/9999_02_00.jpg?Watchout=1182344561&User=VIybnoLd8cthJ7MfsFM6EfD3M_&dominus=3PK5GF6789

Должно стать в моем текстовом файле:

https://mysite.local/9999/9999_01_00.jpg?Watchout=1588338564&User=oj-e39DOyiUJCjtG3E2DWaeT8Q8_&dominus=3PK5GF6789
https://mysite.local/9999/9999_01_01.jpg?Watchout=1182344561&User=EjHBJ-biGSlM-ewPMVs_&dominus=3PK5GF6789
https://mysite.local/9999/9999_01_02.jpg?Watchout=1182344561&User=IPElkKyuulUYY1AL~~y4Y-HedKarGntAexw14_&dominus=3PK5GF6789
https://mysite.local/9999/9999_02_00.jpg?Watchout=1182344561&User=VIybnoLd8cthJ7MfsFM6EfD3M_&dominus=3PK5GF6789

Потому что я считаю 3 раза: https://mysite.local/9999/9999_01_01.jpg, мне нужен только один раз каждый файл JPG: 9999_01_00.jpg

как я могу это сделать? удалить дублирующую строку не очень сложно, но когда строки не очень похожи, это немного сложнее!

спасибо!

1 Ответ

0 голосов
/ 29 апреля 2020

Один из способов сделать это:

$newText = Get-Content -Path 'X:\FileWithUrls.txt' |
            Group-Object @{Expression = { ($_ -split '\?')[0]}} | 
            ForEach-Object { $_.Group[0] }

# output on screen
$newText

# output to new text file
$newText | Set-Content -Path 'X:\DeDupedFileWithUrls.txt' -Force

Вывод:

https://mysite.local/9999/9999_01_00.jpg?Watchout=1588338564&User=oj-e39DOyiUJCjtG3E2DWaeT8Q8_&dominus=3PK5GF6789
https://mysite.local/9999/9999_01_01.jpg?Watchout=1182344561&User=EjHBJ-biGSlM-ewPMVs_&dominus=3PK5GF6789
https://mysite.local/9999/9999_01_02.jpg?Watchout=1182344561&User=IPElkKyuulUYY1AL~~y4Y-HedKarGntAexw14_&dominus=3PK5GF6789
https://mysite.local/9999/9999_02_00.jpg?Watchout=1182344561&User=VIybnoLd8cthJ7MfsFM6EfD3M_&dominus=3PK5GF6789


Небольшое объяснение:

Group-Object группирует похожие строки из текстового файла вместе.
Это основано на предоставляемом нами свойстве, и в данном случае это часть строки перед ?.

Чтобы получить это, мы просто разбиваем строку на вопросительном знаке и используем только первую часть [0].

, потому что -split использует регулярное выражение, нам нужно избежать этого с \?

Это обернуто внутри вычисленного (на Свойство -fly) с @{Expression = { ($_ -split '\?')[0]}}

Далее мы проводим oop через группы и выводим только первый элемент каждой группы

...