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
}
目标文件夹必须预先存在。
如果可能的话,我需要在 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
}
目标文件夹必须预先存在。