Linux/UNIX の場合の cut
以下の様なリストがあったとする。
list.txt
Yamada Taro,Tokyo,18
Yamada Jiro,Tokyo,16
Sasaki Ichiro,Chiba,22
Suzuki Saburo,Hokkaido,40
Yamaguchi Shiro,Niigata,39
このリストを、(,)区切りリストとして認識させ、1番目のアイテムだけを取得したい場合、シェルだと以下の様にできる。
[root]/tmp> cat list.txt | cut -f 1 -d ","
Yamada Taro
Yamada Jiro
Sasaki Ichiro
Suzuki Saburo
Yamaguchi Shiro
[root]/tmp>
方法1 : Select-Object を使う
Windows Power Shell では、 cut 相当の機能を以下のように実現できる
PS C:\temp> Get-Content ".\list.txt" | Select-Object {$($_-split(","))[0]}
$($_-split(","))[0]
-------------------
Yamada Taro
Yamada Jiro
Sasaki Ichiro
Suzuki Saburo
Yamaguchi Shiro
PS C:\temp>
式が複雑なので、多分、こういう理解かな。というのを書いておくと・・・(理解が間違っている事に気づいたら書き直す)
1) Get-Content で、list.txt の内容を取得し
Get-Content ".\list.txt" | Select-Object {$($_-split(","))[0]}
2) お隣(右側) にパイプで渡し、
Get-Content ".\list.txt" | Select-Object {$($_-split(","))[0]}
3) 渡されたオブジェクト $_ を、演算子 –split で、, (カンマ)を区切り文字として分解した後
Get-Content ".\list.txt" | Select-Object {$($_-split(","))[0]}
( これは Select-Object の機能では無く、引き渡された Object 自身が持っているメソッドで分解している。)
※ -split の様なものを演算子、 $a.Split( ) の様な使い方をされるものをメソッド。と言う。
4) Select-Object を使って 0番目のデータを取り出している
Get-Content ".\list.txt" | Select-Object {$($_-split(","))[0]}
方法2 : ForEach-Object を使う (お奨め)
しかしこの方法だと、以下の様に、元のデータには存在しない青字の部分のヘッダーが出てくる。
PS C:\temp> Get-Content ".\list.txt" | Select-Object {$($_-split(","))[0]}
$($_-split(","))[0]
-------------------
Yamada Taro
Yamada Jiro
Sasaki Ichiro
Suzuki Saburo
Yamaguchi Shiro
PS C:\temp>
これは、以下の様に Select-Object を ForEach-Object (省略形 %) に変更すると出なくなる。
PS C:\temp> Get-Content ".\list.txt" | % {$($_-split(","))[0]}
Yamada Taro
Yamada Jiro
Sasaki Ichiro
Suzuki Saburo
Yamaguchi Shiro
PS C:\temp>
さらに、-split 演算子よりも、 Split( ) メソッドの方が簡単である事に気づく。以下の様に複数のデータを出力できる。
例えば cut コマンドで、1つ目と2つ目の要素を抜き出す以下のコマンドは
PS C:\temp> cat list.txt | cut -f 1-2 -d ","
Yamada Taro,Tokyo
Yamada Jiro,Tokyo
Sasaki Ichiro,Chiba
Suzuki Saburo,Hokkaido
Yamaguchi Shiro,Niigata
PS C:\temp>
Windows Power Shell で以下の様に書き直せる。(配列的な考え方なので、要素は0から始まる)
PS C:\temp> Get-Content ".\list.txt" | % { $_.Split(",")[0] + " , " + $_.Split(",")[1] }
Yamada Taro , Tokyo
Yamada Jiro , Tokyo
Sasaki Ichiro , Chiba
Suzuki Saburo , Hokkaido
Yamaguchi Shiro , Niigata
PS C:\temp>
-split 演算子を使おうとしてエラーが出る場合
Windows Power Shell 1.0の場合は、split を使おうとすると、以下のエラーが出た。これは、Power Shell 2.0 にアップグレードする事で解決した。
-split 演算子は,Power Shell 2.0 からの新機能だそうだ。
PS C:\temp> Get-Content "./list.txt" | % {$($_-split(","))[0]}
’-‘演算子の右側に値の式を指定する必要があります。
発生場所 行:1 文字:34
+ Get-Content “./list.txt” | % {$($_-split(","))[0]}
PS C:\temp>