OS Windows Windows PowerShell

Windows PowerShell : UNIXの cut コマンド相当の作業をする。

2011年1月22日

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-ObjectForEach-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>

-OS, Windows, Windows PowerShell

Copyright© エンジニアの何でもメモ帳 , 2020 All Rights Reserved.