Powershell 删除包含多个文本文件的文件夹中的重复行

Powershell remove duplicate lines in a folder that contains multiple text files

如果可能的话,我需要在 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" 大小比原来的 "Urls"!

大了大约 200kb

仅供参考,每个文件都是来自 linux vm 的 Squid 代理的 powershell 操纵的 "access.log",但我已经检查了编码和 "strange" 记事本++的字符。 (我无法访问 linux shell)

这是 "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




编辑 3:

请见谅,我会尽量解释清楚的!

我会维护 "Urls" 文件夹的结构,其中包含多个文件; 我会删除(或替换为“$ null”)重复项 "on an all-files basis" 但保留文件夹中的每个文件,即:不是一个包含所有 http 地址的大文件! 在 EDIT 2 中,我向 Olaf 展示了字符串 "https://httpd.apache.org/docs/2.4/mod/mod_md.html" 仍然是重复的,因为它存在于 "$mypath\file1.txt" 和文件 "$mypath\file512.txt" 中! 我知道 Olaf 的代码检查重复项 "on a per-file basis"(感谢 @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
        }

我认为您对编辑 #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
        }

目标文件夹必须预先存在。