Sorting in file. Pls help me

Hello. I have next content of file :
10.0.17.0 | do not use | reserved for future rtr/fw/gwy |
10.0.17.1 | core-sw | vlan 500 (mgmt) |
20.0.17.255 | do not use | reserved for future rtr/fw/gwy) |
10.0.17.5 |Pod17-Edge-FW| vlan 500 (mgmt) |
How can I sort lines of file by IP-addresses. Thanks in advance

You can use sort-object: This is what I got:

Before Script
PS C:\WINDOWS\system32> gc C:\Test\iptxt.txt
10.0.17.0 | do not use | reserved for future rtr/fw/gwy |
10.0.17.1 | core-sw | vlan 500 (mgmt) |
20.0.17.255 | do not use | reserved for future rtr/fw/gwy) |
10.0.17.5 | Pod17-Edge-FW| vlan 500 (mgmt) |

After using sort-object:
PS C:\WINDOWS\system32> gc C:\Test\iptxt.txt | Sort-Object
10.0.17.0 | do not use | reserved for future rtr/fw/gwy |
10.0.17.1 | core-sw | vlan 500 (mgmt) |
10.0.17.5 | Pod17-Edge-FW| vlan 500 (mgmt) |
20.0.17.255 | do not use | reserved for future rtr/fw/gwy) |

# If the pipe, '|', exists in file, create pscustomobject
Get-Content .\myfile.txt | ConvertFrom-Csv -Delimiter '|' -Header 'IP Address','Device','VLAN' | Sort-Object -Property 'IP Address'

Thanks Wilfredo. I tried to do it via regular expression, but it is easy that I thought. :slight_smile:

it doesn’t work correct :frowning: P
Get-Content $MDPATH|Sort
| 10.0.16.11 |Pod16-AD| vlan 500 (mgmt) |
| 10.0.16.255 | do not use | reserved for future rtr/fw/gwy) |
| 10.0.16.5 |Pod16-Edge-FW| vlan 500 (mgmt) |
| 10.0.16.50 |Pod16-smc| vlan 500 (mgmt) |
| 10.0.16.51 |Pod16-flow-col| vlan 500 (mgmt) |
| 10.0.16.52 |Pod16-flow-repl| vlan 500 (mgmt) |
| 10.0.16.53 |Pod16-flow-sensor| vlan 500 (mgmt) |
| 10.0.16.55 |Pod16-ISE| vlan 500 (mgmt) |

If the pipe, ‘|’, is used to separate parts of your file, then my previous post should work.

No it won’t. That’s because you’re sorting as a string. In that case “10.0.16.255” comes before “10.0.16.5”. You need to convert the IP address into something that is sortable. The trick most often used is to cast it at [version] which can then be properly sorted. For instance …

$data = Get-Content -Path C:\Ephemeral\iptext.txt | 
    ConvertFrom-Csv -Delimiter '|' -Header 'IP','Name','Notes','Other'
$results = foreach ($item in $data)
{
    [PSCustomObject]@{
        IP = [version]$item.IP
        Name = $item.Name
        Notes = $item.Notes
        Other = $item.Other
    }
}
$results | sort -Property IP | Out-GridView

This also assumes correct header alignment, which I can’t guarantee since your two samples are different, e.g., your second sample has a leading bar character whereas your first didn’t.

Bob, you are right. After testing with a larger list, I noticed 10.0.16.255 was listed before 10.0.16.5. My post worked with the initial (smaller) list, but not a larger list. Casting the IP address is required.

# Cast
select-object -Property @{n='ip address';exp={[version]$_.'ip address'}}

yes. it works. Thanks you. How i can add again my delimeter ‘|’ to file?

$results = Get-Content C:\Test\iptxt.txt |
    ConvertFrom-Csv -Delimiter '|' -Header 'IP','Name','Notes','Other' |
    Sort-Object {[version]$_.ip}

$results | Export-Csv C:\Test\iptxtresults.csv -Delimiter '|' -NoTypeInformation

# another (not recommended) option so the final result does not have quotes.
# it appears that your original file has a space on either side of the '|'
# you can add that back in the following line if needed
$results | % {"$($_.ip)|$($_.name)|$($_.notes)|$($_.other)"} | Out-File C:\Test\iptxtresults.txt