如何在Windows PowerShell中移除每行一个重复实例并按频率排序剩余行
需求说明
现有一个约1亿行短内容的未排序文本文件,示例内容如下:
Lucy Mary Mary Mary John John John Lucy Mark Mary
需要完成两个核心操作:
- 移除每个相同行的一个实例
- 将剩余行按原文件中的重复次数从多到少排序(出现频率越高的行越靠前)
最终预期结果如下:
Mary Mary Mary John John Lucy
要求在Windows PowerShell中完成上述处理。
PowerShell实现方案
针对1亿行的大文件,必须兼顾内存效率和处理速度,以下是可行的命令实现:
Get-Content -Path "待处理文件路径.txt" -ReadCount 10000 | ForEach-Object { $_ } | Group-Object -AsString | Sort-Object -Property Count -Descending | ForEach-Object { # 输出Count-1次当前行,即移除1个实例 for ($i=0; $i -lt $_.Count -1; $i++) { $_.Name } } | Out-File -Path "处理结果文件.txt" -Encoding UTF8
关键步骤解释
- 批量读取文件:
Get-Content -ReadCount 10000按10000行批量加载文件,避免一次性把1亿行塞进内存导致溢出。你可以根据机器内存情况调整这个数值,比如改成50000进一步提升效率。 - 分组统计次数:
Group-Object -AsString把内容相同的行归为一组,同时自动统计每组的出现次数(存在Count属性里)。 - 按次数降序排序:
Sort-Object -Property Count -Descending让出现次数多的分组排在前面。 - 移除单个实例并输出:通过循环输出每组
Count-1次内容,实现移除一个实例的需求。 - 写入结果文件:
Out-File直接把结果写入文件,避免输出到控制台拖慢处理速度,指定UTF8编码防止中文乱码。
额外优化建议
- 运行64位PowerShell:32位版本内存上限较低,处理大文件容易卡顿,优先用64位版本。
- 关闭不必要的后台程序:释放更多系统资源给PowerShell处理大文件。
内容的提问来源于stack exchange,提问作者tes389
相关产品推荐
相关产品推荐

