This topic contains 6 replies, has 2 voices, and was last updated by
July 24, 2013 at 8:41 am #8744
How can I sort a list but add a specific item to the top? For example:
Let's say I want to sort the list alphabetically but I want peach up top and I only want it to appear once. I would also like Grapefruit to be 2nd. Thanks in advance!
July 24, 2013 at 8:45 am #8745
Yeah, pasting didn't work :). Try the TEXT tab if you want to paste.
July 24, 2013 at 9:38 am #8758
Thank you Don! Lesson learned don't paste in the forums unless I'm on the text tab.
I tried to go back and edit it but the forums stared giving me a 401 error around that time. I hope I did not cause that.
Anyway as far as a real world example I am trying to write a script that sets the binding order for all of the network interfaces on Hyper-V hypervisors. I have everything working now I just need to be able to sort the NICs. So the real lines look something like this. . .
July 24, 2013 at 9:56 am #8759
There'd be no easy way to do this. You'd probably pipe your list to Sort-Object first, and grab that in a variable. Then you'd have to construct a new array, adding objects to it in whatever order you want, and then output that array. There's not really a more elegant approach.
July 24, 2013 at 4:03 pm #8767
I think I got it. . .
# Put the 2 I want on top of a temp file
"peach" | Out-File .\step2.txt -Force
"grapefruit" | Out-File .\step2.txt -Append
# Get the list I can't control and append it after my top 2
Get-Content .\unsorted.txt | Sort-Object | Out-File .\step2.txt -Append
# Sort the temp file and exclude duplicates
Get-Content .\step2.txt | Select-Object -Unique
# I promise Don Jones I will learn to work with arrays that have carriage returns in them
# Currently I only know comma separated arrays
July 25, 2013 at 6:24 am #8784
I'd be happy to have ya putting stuff in variables instead of in files as an interim holding area ;).
So, a couple of things: Arrays don't "have" commas or carriage returns. An array is (basically) a collection of objects. PowerShell interprets comma-separated lists as arrays ($array = 1,2,3) and when it reads a file, it uses newline (CRLF) characters to return each line of the file as an object – meaning the entire file is interpreted as an array of strings.
So if I had things at the top in $topmost ($topmost = 'peach','plum'), and I had other objects in $main ($main = 'apple','pear','mango'), I would probably do:
$sorted_main = $main | sort-object
$topmost,sorted_main | select -unique
As a quick way to get my list.
July 25, 2013 at 3:31 pm #8819
Looking forward to the podcast tonight for sure. OK so here we go I think I learned something here. . .
$topmost = 'peach','grapefruit'
$main = 'apple','orange','peach','pear','grapefruit'
$sorted_main = $main | Sort-Object
$topmost+$sorted_main | Select-Object -unique
In my real word array of strings the duplicates are going to be there so I joined (+) topmost and sorted main so I could filter out the duplicates. The variable we are calling "main" is a list of objects from a registry key I can not predict or control and the 2 objects I want sorted to the top are already in there. So I like this and I think you have helped me greatly and now I don't have to rely on saving to a file and getting content out of a file to sort my list and what I posted above works exactly like I need. Thanks again this is awesome!
The topic ‘Sort a list but have 2 specific objects at the top’ is closed to new replies.