使用Powershell比较两个文本文件并删除重复的行

时间:2019-12-29 18:55:26

标签: powershell

我有两个包含许多重复行的文本文件。我想运行一个powershell语句,该语句将仅在第一个文件中没有值的情况下输出一个新文件。下面是两个文件的示例。

File1.txt
-----------
Alpha
Bravo
Charlie


File2.txt
-----------
Alpha
Echo
Foxtrot

在这种情况下,只有Echo和Foxtrot不在第一个文件中。因此,这些将是理想的结果。

OutputFile.txt
------------
Echo
Foxtrot

我查看了下面的链接,该链接与我想要的链接相似,但这并未将结果写入输出文件。

Remove lines from file1 that exist in file2 in Powershell

2 个答案:

答案 0 :(得分:2)

这里是一种方法:

# Get unique values from first file
$uniqueFile1 = (Get-Content -Path .\File1.txt) | Sort-Object -Unique

# Get lines in second file that aren't in first and save to a file
Get-Content -Path .\File2.txt | Where-Object { $uniqueFile1 -notcontains $_ } | Out-File .\OutputFile.txt

答案 1 :(得分:1)

使用引用链接中的方法将起作用,但是,对于原始文件中的每一行,它将触发从磁盘读取第二个文件。根据文件大小,这可能会很痛苦。我认为以下方法可以满足您的需求。

$file1 = Get-Content .\File1.txt
$file2 = Get-Content .\File2.txt

$compareParams = @{
    ReferenceObject = $file1
    DifferenceObject = $file2
}

Compare-Object @compareParams | 
    Where-Object -Property SideIndicator -eq '=>' |
    Select-Object -ExpandProperty InputObject |
    Out-File -FilePath .\OutputFile.txt

此代码执行以下操作:

  1. 将每个文件读入一个单独的变量
  2. Compare-Object的参数创建一个哈希表(有关更多信息,请参见about_Splatting
  3. 比较内存中的两个文件,并将结果传递到Out-File
  4. 将管道的内容写入“ OutputFile.txt”

如果您对它的整体流程感到满意,并且仅在一次性情况下使用它,则可以将整个东西压缩成单线。

(Compare-Object (gc .\File1.txt) (gc .\File2.txt) | ? SideIndicator -eq '=>').InputObject | Out-File .\OutputFile.txt