Powershell сравнивает текстовые файлы и записывает строки различий в новый файл - PullRequest
0 голосов
/ 19 апреля 2020

Файл 1.txt

Abc
Def
Xyz

Файл 2.txt

Xyz
Def

Ab c не найден в файле 2, когда файл 1 сравнивается с файлом 2, поэтому хотите записать Ab c в новый файл diff.txt.

diff.txt

Abc

Я видел много постов, использующих сравниваемый объект, но они не выдают результаты, подобные моим требованиям. Я новичок в Powershell

1 Ответ

1 голос
/ 19 апреля 2020

Насколько я понимаю, вы хотите написать все строки из 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...