n番目のフィールドでソート

2024-11-24

はじめに

ヘッダ行のないcsvファイルをn番目のフィールドでソートするPowerShellのコマンドについて.

結論

-split演算子で行を分割し,ソートするフィールドの順番を指定する.一番左のフィールドが0番目なので,例えば2番目なら[1]となる.

PS> Get-Content sam.csv|Sort-Object -Property {($_ -split ',')[1]}

3番目のフィールドを整数として降順で並べたいなら.

PS> Get-Content sam.csv|Sort-Object -Property {[int]($_ -split ',')[2]} -Descending

.NETのString.Split()メソッドを使用することも可.

PS> Get-Content sam.csv|Sort-Object -Property {$_.split(',')[1]}

PS> Get-Content sam.csv|Sort-Object -Property {[int]$_.split(',')[2]} -Descending

やりたいこと

以下のcsvファイルの2番目のフィールドの昇順に並べたい.

sam.csv

001,Baltimore,100
002,Detroit,110
003,Chicago,120
004,Atlanta,90

PowerShellのコマンドはこう.

  1. カレント行$_-split演算子で分割
  2. 区切文字はカンマ(,
  3. 一番左のフィールドが0番目なので,2番目のフィールドなら[1]
PS> Get-Content sam.csv|Sort-Object -Property {($_ -split ',')[1]}
004,Atlanta,90
001,Baltimore,100
003,Chicago,120
002,Detroit,110

ちなみに,UNIXのsortコマンドならこう.

$ sort -k2,2 -t, sam.csv
004,Atlanta,90
001,Baltimore,100
003,Chicago,120
002,Detroit,110

3番目のフィールドを数値として降順に並べる.

PS> Get-Content sam.csv|Sort-Object -Property {[INT]($_ -split ',')[2]} -Descending
003,Chicago,120
002,Detroit,110
001,Baltimore,100
004,Atlanta,90

ちなみに,UNIXのsortコマンドならこう.

$ sort -k3,3 -t, -nr sam.csv
003,Chicago,120
002,Detroit,110
001,Baltimore,100
004,Atlanta,90

環境

  • Windows 10 Pro
  • PowerShell 5.1

参考