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

时间:2017-10-11 03:40:17

标签: windows powershell text command-line compare

两个目录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 都可以使用。

3 个答案:

答案 0 :(得分:2)

使用sort -ubashcombine

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