Сортировка хэш-таблицы PowerShell по свойству значения
у меня проблема с сортировкой хэш-таблицы. Я разбил свой код на голые предметы первой необходимости, чтобы не перегружать никого своим оригинальным сценарием.
Write-Host "PowerShell Version = " ([string]$psversiontable.psversion)
$h = @{}
$Value = @{SortOrder=1;v1=1;}
$h.Add(1, $Value)
$Value = @{SortOrder=2;v1=1;}
$h.Add(2, $Value)
$Value = @{SortOrder=3;v1=1;}
$h.Add(3, $Value)
$Value = @{SortOrder=4;v1=1;}
$h.Add(4, $Value)
Write-Host "Ascending"
foreach($f in $h.GetEnumerator() | Sort-Object Value.SortOrder)
{
Write-Host $f.Value.SortOrder
}
Write-Host "Descending"
foreach($f in $h.GetEnumerator() | Sort-Object Value.SortOrder -descending)
{
Write-Host $f.Value.SortOrder
}
выход
PowerShell Version = 3.0
Ascending
2
1
4
3
Descending
2
1
4
3
Я уверен, что это простое дело, не зная правильного использования Sort-Object
. Сортировка работает правильно на Sort-Object Name
Так что, возможно, это как-то связано с незнанием того, как обращаться с Value.SortOrder
?
2 ответов
Сортировка-Объект принимает имя свойства или блок сценария, используемый для сортировки. Поскольку вы пытаетесь отсортировать свойство свойства, вам нужно будет использовать блок скрипта:
Write-Host "Ascending"
$h.GetEnumerator() |
Sort-Object { $_.Value.SortOrder } |
ForEach-Object { Write-Host $_.Value.SortOrder }
Write-Host "Descending"
$h.GetEnumerator() |
Sort-Object { $_.Value.SortOrder } -Descending |
ForEach-Object { Write-Host $_.Value.SortOrder }
вы можете фильтровать с помощью Где-Объект:
Write-Host "Ascending"
$h.GetEnumerator() |
Where-Object { $_.Name -ge 2 } |
Sort-Object { $_.Value.SortOrder } |
ForEach-Object { Write-Host $_.Value.SortOrder }
вы обычно хотите поставить Where-Object
до любой Sort-Object
командлеты, так как это делает сортировку быстрее.
я использовал хэш-таблицу в качестве таблицы частот, чтобы подсчитать появление слов в именах файлов.
$words = @{}
get-childitem *.pdf | foreach-object -process {
$name = $_.name.substring($_.name.indexof("-") + 1, $_.name.indexof(".") - $_.name.indexof("-") - 1)
$name = $name.replace("_", " ")
$word = $name.split(" ")[0]
if ( $words.contains($word) ){
$words[$word] = $words[$word] + 1
}else{
$words.add($word, 1)
}
}
$words.getenumerator() | sort-object -property value
Это последняя строка, которая делает магию, сортируя хэш-таблицу по значению (частоте).