2017-01-24 94 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