比较文本文件 - Powershell
Compare txt files - Powershell
我有两个 txt 文件。两者都包含用户名列表:
列表 1:
user1
user2
user3
列表 2:
user1
user2
user7
我想比较这两个列表。我想知道哪些用户不存在于两个列表中。
所以这种情况下的输出应该是这个列表:
最终名单:
user3
user7
这是我的代码:
$list1 = get-content -Path "C:\list1.txt"
$list2 = get-content -Path "C:\list2.txt"
$endlist = foreach ($item in $list1)
{
if ($item -notmatch $list2)
{
[PSCustomObject]@{
Name = $item
}
}
$endlist |Out-file "C:\endlist.txt"
我做错了什么?
使用compare-object
Compare-Object -ReferenceObject $list1 -DifferenceObject $list2 | Select-Object -ExpandProperty InputObject
通常您会为此使用 Compare-Object
:
$list1 = 'user1', 'user2', 'user3'
$list2 = 'user1', 'user2', 'user7'
(Compare-Object $list1 $list2).InputObject # => user3, user7
如果您想手动进行比较,并且因为您想知道每个列表中唯一的对象,您将需要 两个 循环并使用 containment operator(在本例中为-notin
或-notcontains
):
$list1 = (Get-Content list1.txt).Trim()
$list2 = (Get-Content list2.txt).Trim()
& {
foreach($i in $list1) {
if($i -notin $list2) { $i }
}
foreach($i in $list2) {
if($i -notin $list1) { $i }
}
} | Out-File "endlist.txt"
补充现有的工作解决方案,这是另一个使用 HashSet
的解决方案,它可能比 Compare-Object
更快:
[Collections.Generic.HashSet[string]] $list1 = Get-Content list1.txt
[Collections.Generic.HashSet[string]] $list2 = Get-Content list2.txt
$list1.SymmetricExceptWith($list2)
$list1
输出:
user7
user3
HashSet
奇怪地命名为 1 SymmetricExceptWith
方法 修改 第一个集合只包含那些元素对任何一组都是独一无二的。
1) 数学术语为symmetric difference.
我有两个 txt 文件。两者都包含用户名列表:
列表 1:
user1
user2
user3
列表 2:
user1
user2
user7
我想比较这两个列表。我想知道哪些用户不存在于两个列表中。 所以这种情况下的输出应该是这个列表:
最终名单:
user3
user7
这是我的代码:
$list1 = get-content -Path "C:\list1.txt"
$list2 = get-content -Path "C:\list2.txt"
$endlist = foreach ($item in $list1)
{
if ($item -notmatch $list2)
{
[PSCustomObject]@{
Name = $item
}
}
$endlist |Out-file "C:\endlist.txt"
我做错了什么?
使用compare-object
Compare-Object -ReferenceObject $list1 -DifferenceObject $list2 | Select-Object -ExpandProperty InputObject
通常您会为此使用 Compare-Object
:
$list1 = 'user1', 'user2', 'user3'
$list2 = 'user1', 'user2', 'user7'
(Compare-Object $list1 $list2).InputObject # => user3, user7
如果您想手动进行比较,并且因为您想知道每个列表中唯一的对象,您将需要 两个 循环并使用 containment operator(在本例中为-notin
或-notcontains
):
$list1 = (Get-Content list1.txt).Trim()
$list2 = (Get-Content list2.txt).Trim()
& {
foreach($i in $list1) {
if($i -notin $list2) { $i }
}
foreach($i in $list2) {
if($i -notin $list1) { $i }
}
} | Out-File "endlist.txt"
补充现有的工作解决方案,这是另一个使用 HashSet
的解决方案,它可能比 Compare-Object
更快:
[Collections.Generic.HashSet[string]] $list1 = Get-Content list1.txt
[Collections.Generic.HashSet[string]] $list2 = Get-Content list2.txt
$list1.SymmetricExceptWith($list2)
$list1
输出:
user7
user3
HashSet
奇怪地命名为 1 SymmetricExceptWith
方法 修改 第一个集合只包含那些元素对任何一组都是独一无二的。
1) 数学术语为symmetric difference.