custom sorting in powershell

后端 未结 2 2082
深忆病人
深忆病人 2021-01-04 05:34

I have filenames in following format:

[ignore-prefix]-[important-middle]-[ignore-suffix]-[name-with-digits]

I need to sort according to fo

相关标签:
2条回答
  • 2021-01-04 06:33

    I understand the task in this way: sorting should be performed by 3 expressions: 1) middle part, 2) name part without digits, 3) number represented by trailing digits of the name part.

    Let’s create these expressions with regular expressions. Here is the answer:

    # gets the middle part
    $part1 = { if ($_.Name -match '^[^-]+-([^-]+)') { $matches[1] } }
    
    # gets the name part with no digits
    $part2 = { if ($_.Name -match '^[^-]+-[^-]+-[^-]+-(\D+)') { $matches[1] } }
    
    # gets the number represented by digits from name (cast to [int]!)
    $part3 = { if ($_.Name -match '^[^-]+-[^-]+-[^-]+-\D+(\d+)') { [int]$matches[1] } }
    
    # sort it by 3 expressions
    $filelist | Sort-Object $part1, $part2, $part3
    

    For better understanding of how it works you may test these expressions separately:

    $part1 = { if ($_.Name -match '^[^-]+-([^-]+)') { $matches[1] } }
    $part2 = { if ($_.Name -match '^[^-]+-[^-]+-[^-]+-(\D+)') { $matches[1] } }
    $part3 = { if ($_.Name -match '^[^-]+-[^-]+-[^-]+-\D+(\d+)') { [int]$matches[1] } }
    
    Write-Host '----- test1'
    $filelist | % $part1
    
    Write-Host '----- test2'
    $filelist | % $part2
    
    Write-Host '----- test3'
    $filelist | % $part3
    

    As a result, for example, these files (extension is not important):

    aaa-zzz-1ignore-wname10.txt
    aaa-zzz-1ignore-wname2.txt
    ignore-aaa-1ignore-wname10.txt
    ignore-aaa-1ignore-wname2.txt
    

    will be sorted like:

    ignore-aaa-1ignore-wname2.txt
    ignore-aaa-1ignore-wname10.txt
    aaa-zzz-1ignore-wname2.txt
    aaa-zzz-1ignore-wname10.txt
    
    0 讨论(0)
  • 2021-01-04 06:33

    Does this do it?

     ls | sort { ($_ -split '-')[1] }
    
           Directory: C:\users\js\foo
    
    
    Mode                LastWriteTime         Length Name
    ----                -------------         ------ ----
    -a----        7/22/2019   5:20 PM             10 pre-aaa-zuf-joe111
    -a----        7/22/2019   5:20 PM             10 bre-aab-suf-joe112
    -a----        7/22/2019   5:20 PM             10 pre-aac-auf-joe113
    
    0 讨论(0)
提交回复
热议问题