Powershell удалить повторяющиеся строки в папке, содержащей несколько текстовых файлов

Мне нужно, если возможно, удалить на месте повторяющиеся строки в пути с несколькими текстовыми файлами в powershell.

Я нашел способ получить список строк:

Get-Content "$path\*.*" | Group-Object | Where-Object { $_.Count -gt 1 } | Select -ExpandProperty Name

Теперь я думаю, что цикл foreach будет полезен, но я не знаю, как обрабатывать действие удаления на месте...

Может кто-то мне помочь, пожалуйста?

РЕДАКТИРОВАТЬ: я изменил название вопроса, чтобы избежать недоразумений!

РЕДАКТИРОВАТЬ 2 (на основе подсказки Олафа):

PS C:\Users\Robbi> $mypath = "F:\DATA\Urls_CP"
PS C:\Users\Robbi> Get-ChildItem -Path $mypath -Filter * |
>>     ForEach-Object{
>>         $Content =
>>         Get-Content -Path $_.FullName | Sort-Object -Unique
>>         $Content | Out-File -FilePath $_.FullName
>>     }

PS C:\Users\Robbi> Get-Content $mypath\* | Select-String "https://httpd.apache.org/docs/2.4/mod/mod_md.html"

https://httpd.apache.org/docs/2.4/mod/mod_md.html
https://httpd.apache.org/docs/2.4/mod/mod_md.html

Но что-то изменилось, я скопировал исходную папку с именем «Urls» и запустил ваш код в скопированной папке «Urls_CP»; Размер «Urls_CP» примерно на 200 КБ больше, чем исходный «URLS»!

Просто для информации: каждый файл представляет собой управляемый powershell «access.log» прокси-сервера Squid из linux vm, но я проверил кодировку и наличие «странных» символов с помощью notepad ++. (у меня нет доступа к оболочке Linux)

Это выдержка из одного файла в папке «URLS»:

https://community.checkpoint.com/t5/API-CLI-Discussion-and-Samples/can-anybody-let-me-know-how-can-we-import-policy-rules-via-csv/td-p/20839
https://community.checkpoint.com/t5/API-CLI-Discussion-and-Samples/Python-tool-for-exporting-importing-a-policy-package-or-parts-of/td-p/41100
https://community.checkpoint.com/t5/General-Management-Topics/R80-10-API-bug-fallback-to-quot-SmartCenter-Only-quot-after/m-p/5074
https://github.com/CheckPointSW/cp_mgmt_api_python_sdk
https://github.com/CheckPointSW/cpAnsible/issues/2
https://github.com/CheckPointSW/ExportImportPolicyPackage/issues
https://stackoverflow.com/questions/15031694/installing-python-packages-from-local-file-system-folder-to-virtualenv-with-pip
https://stackoverflow.com/questions/24627525/fatal-error-in-launcher-unable-to-create-process-using-c-program-files-x86
https://stackoverflow.com/questions/25749621/whats-the-difference-between-pip-install-and-python-m-pip-install
https://stackoverflow.com/questions/42494229/how-to-pip-install-a-local-python-package

РЕДАКТИРОВАТЬ 3:

Пожалуйста, простите меня, я постараюсь объяснить мне лучше!

Я бы сохранил структуру папки «URLS», которая содержит несколько файлов; Я бы удалил (или заменил на «$ null») дубликаты «для всех файлов», но сохранил бы каждый файл в папке, то есть: не один большой файл со всем http-адресом внутри! В EDIT 2 я показал Олафу, что строка "https://httpd.apache.org/docs/2.4/mod/mod_md.html" все еще дублируется, потому что она присутствует в "$mypath\file1.txt" и в файле "$mypath\file512.txt"! Я понимаю, что проверка кода Олафа на наличие дубликатов «для каждого файла» (спасибо @Lee_Dailey, у меня есть непонятное в моем вопросе!)

РЕДАКТИРОВАТЬ 4:

$SourcePath = 'F:\DATA\Urls_CP'
$TargetPath = 'F:\DATA\Urls_CP\DeDupe'

$UrlList = Get-ChildItem -Path $SourcePath -Filter *.txt |
    ForEach-Object {
        $FileName = $_.BaseName
        $FileLWT = (Get-ItemProperty $_.FullName).LastWriteTime
        Get-Content -Path $_.FullName -Encoding default |
            ForEach-Object {
                [PSCustomObject]@{
                    URL = $_
                    File = $FileName
                    LWT = $FileLWT
                }
            }
    }

$UrlList | 
    Sort-Object -Property URL -Unique |
        ForEach-Object {
            $TargetFile = Join-Path -Path $TargetPath -ChildPath ($_.File + '.txt')
            $_.URL | Out-File -FilePath $TargetFile -Append -Encoding default
            Set-ItemProperty $TargetFile -Name LastWriteTime -Value $_.LWT
        }

person ilRobby    schedule 15.05.2020    source источник
comment
Не могли бы вы поделиться некоторыми образцами данных, с которыми вы имеете дело, и ожидаемым результатом? Вы пытались найти решение? Powershell удалить повторяющиеся строки в текстовых файлах   -  person Olaf    schedule 16.05.2020
comment
что вы подразумеваете под повторяющимися строками в пути? Вы имеете в виду повторяющиеся строки в файле, найденном в пути к каталогу? Вы имеете в виду любую строку, которая существует более одного раза в строках, найденных во ВСЕХ файлах по пути к каталогу?   -  person Lee_Dailey    schedule 16.05.2020
comment
@Olaf Привет, Олаф, все файлы содержат строки URL-адреса http / s, по одной на строку. Я искал, но нашел только решение, которое отправляет содержимое всех файлов в один файл... моя цель - удалить или заменить пустой строкой на месте каждый файл, содержащий дубликат.   -  person ilRobby    schedule 16.05.2020
comment
@Lee_Dailey Привет, Ли, да, как я уже писал в примере кода, под путем я имею в виду каталог, который содержит много текстовых файлов, и я бы поймал повторяющиеся строки и удалил/заменил на месте любой дубликат, чтобы сохранить только одна уникальная линия.   -  person ilRobby    schedule 16.05.2020
comment
@ilRobby - вы хотите удалить повторяющиеся строки в одном файле за раз, а не строки, которые представляют собой все файлы как группу?   -  person Lee_Dailey    schedule 16.05.2020
comment
@Lee_Dailey Lee, мой подход был попыткой, это не значит, что он правильный! :)   -  person ilRobby    schedule 16.05.2020
comment
@ilRobby - мне жаль, что я не смог ясно выразиться. ваше описание - для меня - неясно и может означать удаление дубликатов для каждого файла ИЛИ удаление дубликатов для всех файлов. они требуют разных подходов.   -  person Lee_Dailey    schedule 16.05.2020
comment
@Lee_Dailey - Прости меня, Lee_Dailey, это моя вина, мой английский, возможно, хуже, чем мои сценарии powershell !!   -  person ilRobby    schedule 16.05.2020
comment
@ALL - В EDIT 3 я пытался объяснить себя лучше, чем до сих пор!   -  person ilRobby    schedule 16.05.2020
comment
@ilRobby - классно! Спасибо тебе за пояснение. [усмехается] Похоже, Olaf теперь знает ответ на ваш вопрос. рад узнать, что у вас это работает так, как нужно.   -  person Lee_Dailey    schedule 17.05.2020


Ответы (1)


Я думаю, что ваше объяснение из Edit # 3 имеет еще меньше смысла. Собственно, для чего эта задача?

$SourcePath = 'F:\DATA\Urls_CP'
$TargetPath = 'F:\DATA\Urls_CP\DeDupe'

$UrlList = Get-ChildItem -Path $SourcePath -Filter *.log |
    ForEach-Object {
        $FileName = $_.BaseName
        Get-Content -Path $_.FullName -Encoding default |
            ForEach-Object {
                [PSCustomObject]@{
                    URL = $_
                    File = $FileName
                }
            }
    }

$UrlList | 
    Sort-Object -Property URL -Unique |
        ForEach-Object {
            $TargetFile = Join-Path -Path $TargetPath -ChildPath ($_.File + '.log')
            $_.URL | Out-File -FilePath $TargetFile -Append -Encoding default
        }

Целевая папка должна существовать заранее.

person Olaf    schedule 16.05.2020
comment
Спасибо Олаф! Пожалуйста, смотрите РЕДАКТИРОВАТЬ 2 вопроса. - person ilRobby; 16.05.2020
comment
@ilRobby Тогда, если это не то, что вы хотите (уникализация строк в файле), отредактируйте свой вопрос и покажите нам, каким будет желаемый результат. Возможно, новый текстовый файл, содержащий все строки из всех файлов *.log, дедуплицирован? - person Theo; 16.05.2020
comment
Изменил код. Попробуйте прямо сейчас и поиграйте немного с кодировкой. - person Olaf; 16.05.2020
comment
@Olaf - Извини, Олаф, я плохо объяснил, твоя первая версия больше соответствовала моим потребностям! Пожалуйста, посмотрите примечание EDIT 3! - person ilRobby; 16.05.2020
comment
Привет Олаф, я думаю, что это ответ! Аудит отд. попросите меня сделать журналы squid более читабельными, вывод, отформатированный с определенными характеристиками, для последующего импорта в механизм больших данных ... Я не знаю реальной цели! Я пытался сохранить исходное время последней записи каждого файла и, кажется, работает, я следовал вашему примеру кода, но можете ли вы проверить РЕДАКТИРОВАТЬ 4, если я выбрал правильный путь? Еще один последний совет, Олаф, есть ли способ сохранить удаленные URL-адреса? Просто чтобы убедиться, что скрипт работает правильно, не сравнивая каждый файл по отдельности... - person ilRobby; 21.05.2020