从两组文本文件中提取唯一的行



两个目录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 -ubashcombine:

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中文件中的更多行。

相关内容

  • 没有找到相关文章

最新更新