Насколько я понимаю, вы хотите написать все строки из File1.txt
, которых нет в File2.txt
.
Мы можем использовать Get-Content
для чтения обоих файлов в массив строк и использовать Where-Object
для фильтрации строк из File1.txt
, которые -notin
File2.txt
. Затем мы можем вывести различия в новый файл с помощью Out-File
.
$file2 = Get-Content -Path .\File2.txt
$diff = Get-Content -Path .\File1.txt | Where-Object {$_ -notin $file2}
$diff | Out-File -FilePath diff.txt
Однако для больших файлов выполните линейный поиск O (N) . с -notin
может быть дорого. Вместо этого мы можем использовать System.Collections.Generic.HashSet<T>
для постоянного времени O (1) поиска с использованием System.Collections.Generic.HashSet<T>.Contains(T)
.
. Для приведенного ниже примера Я использую System.Linq.Enumerable.ToHashSet
для создания этого набора ha sh, который использует массив строк из Get-Content
в качестве System.Collections.Generic.IEnumerable<T>
.
$file2HashSet = [Linq.Enumerable]::ToHashSet(
[string[]] (Get-Content -Path .\File2.txt),
[StringComparer]::CurrentCultureIgnoreCase
)
$diff = Get-Content -Path .\File1.txt | Where-Object {-not $file2HashSet.Contains($_)}
$diff | Out-File -FilePath diff.txt
diff.txt
Abc