powershell 使用Compare-Object比较值

wj8zmpe1  于 2022-11-29  发布在  Shell
关注(0)|答案(2)|浏览(190)

csv文件中有一堆值,列如下所示:

shouston
cgonzalez
bbrown
hlader
kpesavento
jbloom
polson
bcharlow
bcharlow
bkalt

需要查找重复项并进行修改。

# Grab CSV file
$inputFile = Import-Csv -Path $filePath
$text = (Get-Culture).TextInfo
$HashSet = [System.Collections.Generic.HashSet[string]]::new([System.StringComparer]::OrdinalIgnoreCase)

foreach ($line in $inputFile) {
    $name = $line.name
    $line.name = $text.ToTitleCase($name)
    $firstName = $line.name.split(" ")[0]
    $lastName = $line.name.split(" ")[1]
    $newEmail = ($firstName[0] + $lastName).toLower()

    if (!$HashSet.Add($newEmail)) {
        $line.email = ($firstName[0] + $lastName + $line.location_id + "@abc.com").toLower()
    }
    else {
        $line.email = ($firstName[0] + $lastName + "@abc.com").toLower()
    }
} 

$inputFile | Export-Csv $fullPath

但它不像我预期的那样工作-找到一个重复的值并修改它们。在我的情况下,位置也必须添加到第一个重复的电子邮件,例如bcharlow 1 bcharlow 2,而不是它的bcharlow,bcharlow 2。有人能帮助我-我需要如何修改脚本?

wvyml7n5

wvyml7n51#

您可以使用Group-Object来查看重复项,例如:

$val=@(
'**name**',
'shouston',
'cgonzalez',
'bbrown',
'hlader',
'kpesavento',
'jbloom',
'polson',
'bcharlow',
'bcharlow',
'bkalt'
)

$val | Group-Object

将给予你一个计数有多少次给定的值被看到。如果你想看到让说前3你可以管道它排序和选择

$val | Group-Object -NoElement | Sort-Object Count -Descending | Select-Object -First 3

Count Name                     
----- ----                     
    2 bcharlow                 
    1 **name**                 
    1 shouston
cxfofazt

cxfofazt2#

最简单(也是最快)的方法可能是使用HashSet
第一个

相关问题