两个目录A:和B:中的每一个目录中都有一个或多个文本文件。目的是打印一个单个文本文件,该文件包含仅出现在a:中的所有行。
(每个文本文件最多可包含200万行。如果A:有两行或两行以上唯一的行[即,仅在A:中,而不是在B:]中]彼此相同,则unique.txt输出中只需列出其中一行。顺序列表[排序]并不重要。)
下面的剧本要归功于Lieven Keersmakers(干净快速)。然而,我似乎被unique.txt文件中的行截断(在第120个字符处;或换行)所困扰,而不是像A:中那样打印整个唯一的行。
compare -r $(gc C:a*.txt | sort -u) -d $(gc C:b*.txt | sort -u) | ? {$_.SideIndicator -eq '<='} | select inputobject | Out-File unique.txt
我试着用这些来获得完整的、展开的线条,但没有成功:
Format-Table -Wrap -AutoSize |
我做错了什么?Windows命令行或PowerShell都可以工作。
使用sort -u
、bash
和combine
:
combine <(sort -u a/* ) not <(sort -u b/*)
以上假设不需要重复的行,并且Windows文件系统安装在Linux盒子上,或者可以从Linux盒子访问。
注意,combine
不需要排序数据,它可以按给定的任何顺序显示A:*
中的行,并返回未排序的输出,例如:
combine <(cat a/*) not <(cat b/*)
但是如果A:*
包含比B:*
更多的给定行的重复,则这失去了不显示重复行的特性。
以下内容可能会让您开始。
短版本(使用别名)
compare -r $(gc C:a*.txt | sort -u) -d $(gc C:b*.txt | sort -u) |
? {$_.SideIndicator -eq '<='} |
select -expand inputobject |
Out-File unique.txt
长版本
Compare-Object -ReferenceObject $(Get-Content C:a*.txt | Sort-Object -Unique) -DifferenceObject $(Get-Content C:b*.txt | Sort-Object -Unique) |
Where-Object {$PSItem.SideIndicator -eq '<='} |
Select-Object -ExpandProperty inputobject |
Out-File unique.txt
请注意,我无法摆脱与<=
的比较可以而且应该处理得更好的感觉,但我无法轻易找到方法
最幼稚的解决方案应该是类似的解决方案
$inB = [system.collections.generic.HashSet[string]]::new([string[]](Get-Content B* | select -unique))
Get-Content A* |
Where-Object { ! $inB.Contains($_) } |
Out-File onlyinA.txt
然而,您将为在内存中拥有B中所有文件中的所有唯一行而付费。唯一的解决方法(没有更复杂的东西)是批量过滤A中的行,然后依次删除B中文件中的更多行。