两个目录A:和B:中的每一个都有 1个或更多个文本文件。目的是打印一个单个文本文件,其中包含仅 中的所有行。
(每个文本文件最多可包含2百万行。如果A:具有2个或更多个唯一行[即,仅在A:中,而不是在B:]中彼此相同,则只有其中一个需要在unique.txt输出中列出行。[sort]的顺序列表并不重要。)
对于下面的脚本(清洁和快速)归功于Lieven Keersmaekers。然而,我似乎陷入了在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 cmd行或 PowerShell 都可以使用。
答案 0 :(得分:2)
使用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:\*
,则会失去不显示重复行的属性。
答案 1 :(得分:1)
以下可能会帮助您入门。
短版(使用别名)
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
请注意,我无法理解与<=
的比较可以而且应该更好地处理,但我无法轻易找到方法。
答案 2 :(得分:0)
应该有点高效的最天真的解决方案就像是
newsockfd2
但是,您将为内存中B中所有文件的所有唯一行付费。解决这个问题的唯一方法(没有更复杂的东西)将是批量过滤A中的行,并连续删除B中文件中的更多行。