2017-01-24 108 views
1

我想找到一個Powershell命令行,將讀取文本文件中刪除所有重複行(2+)並保留沒有重複的行。我一直無法在Stackoverflow的任何地方找到我的問題的答案。我迄今發現的每個例子都只顯示刪除一條和/或許多重複的行並保留一條。PowerShell - 刪除所有重複的條目

這是可能通過PowerShell 2.0?

PowerShell的命令示例:

Get-Content "C:\Temp\OriginalFile.txt" | select -unique| Out-File "C:\Temp\ResultFile.txt" 

OriginalFile.txt

1 
1 
1 
2 
2 
3 
4 

ResultFile.txt(實際)

1 
2 
3 
4 

ResultsFile.txt(期望)

3 
4 

回答

0

PSV2:

$f = 'C:\Temp\OriginalFile.txt' 

Get-Content $f | Group-Object | ? { $_.Count -eq 1 } | Select-Object -ExpandProperty Name 

PSv3 +允許更清潔和更簡潔的解決方案:

Get-Content $f | Group-Object | ? Count -eq 1 | % Name 

爲簡潔起見,命令使用內置 - 別名?(對於Where-Object)和%(對於ForEach-Object)。

既不Select-Object -Unique也不Get-Unique看似允許限制在輸入輸出到單因素(標準Unix工具uniq內置了這樣的特徵:uniq -u),因此需要一種不同的方法。

上面Group-Object基於溶液可能不是有效的,但它是方便的:

  • 線由相同的內容進行分組,得到表示每個組對象。

  • ? { $_.Count -eq 1 }將組過濾到只有1個成員的組中,實際上是清除所有重複的行。

  • Select-Object -ExpandProperty Name然後將過濾後的組對象轉換回它們表示的輸入行。

+0

謝謝你的回覆。由於你的迴應,我得到了這個工作。 –

+0

我確實必須修改'Select-Object -Expand Name'到'Select-Object -ExpandProperty Name' –

+0

@packetloss:好點:完整的參數名是'-ExpandProperty',在腳本中一定要使用完整的參數名稱(儘管'-Expand'也可以工作) - 答案已更新。 – mklement0