PowerShell は も 初心者未満1ですが…
ずばりこちらの記事がおきにいりです。
もっともわたしは「想定読者」の条件にあてはまりませんが、とてもおもしろくよめました。
しかし僭越ながらツッコミっぽいことを…
「パイプ Oriented 環境、PowerShell」についてです。
cat test.csv | awk -F, '{print $2}'
の PowerShell 代替が
> ```powershell
cat test.csv | %{ $_.Split(",")[1] }
とのことですが、じゃあ awk -F, '{print $2, $NF}'
の代替は?とおもったときに答えをみつけるのにやや苦労しました2――こうするのかなと:
cat test.csv | % { $_.Split(',')[1, -1] -join ' ' }
つぎに
cat test.csv | awk -F, 'BEGIN {total = 0} $4 ~ /20090405/ { total+=$3 }END {print "Total:" total}'
の同等が
> ```powershell
cat .\test.csv | ?{ $_.Split(",")[3] -match "20090405" } | %{$total=0}{ $total += $_.Split(",")[2]}{$total}
で、後者のほうが思考の流れにそってパイプラインの左から右へ処理をつなげていけてよいとのことです。でも、それなら AWK のほうでも
cat test.csv | awk -F, '$4 ~ /20090405/' | awk -F, 'BEGIN {total = 0} { total+=$3 }END {print "Total:" total}'
とかじゃだめなんですか、とおもってしまいます。
あと AWK でパターン・アクションを複数かいたとき、たとえば
cat test.csv | awk -F, '
BEGIN { total1 = total2 = 0 }
$4 ~ /20090405/ { total1 += $3 }
$NF ~ /New-Opportunity/ { total2 += $3 }
END { print "Total1:", total1, "Total2:", total2 }'
の PowerShell 同等には ? { ... }
はつかえず結局
cat test.csv | % { $total1 = $total2 = 0 } {
if ($_.Split(',')[3] -match '20090405') { $total1 += $_.Split(',')[2] }
if ($_.Split(',')[-1] -match 'New-Opportunity') { $total2 += $_.Split(',')[2] }
} { "Total1: $total1 Total2: $total2" }
みたいなことになってしまうんではないかと…。
そういうわけで、とてもおもしろいとおもいつつもじつはこの記事の主張が本当のところはわかってません。しかし、わかっていないのはわたしがまだ PowerShell をまったくわかっていないからで、この記事の趣旨が「あー、そういうことだったのか」とわかるようになることを期待しつつ学習をつづけていきたいとおもいます。
Switch 文について (2020/1/4 加筆)
switch 文に AWK でパターン・アクションを複数かいたとき相当の機能があることをいまごろしりました。
cat test.csv | % { $total1 = $total2 = 0 } {
switch (,$_.split(',')) {
{ $_[3] -match '20090405' } { $total1 += $_[2] }
{ $_[-1] -match 'New-Opportunity' } { $total2 += $_[2] }
}
} { "Total1: $total1 Total2: $total2" }
最初の $_
はパイプをながれてきたブツですが、それ以外の $_
は switch
文のもの、ここでは $_.split(',')
(文字列の配列) です。switch は配列を要素ごとに foreach
みたくします3。そこで ,
4をつけてもとの配列を要素とする要素数 1 の配列をつくってもとの配列がまるっと $_
にわたされるようにしています。
ちなみに以下の記事がすばらしいです。
- Parsing Text with PowerShell (1/3)
- Parsing Text with PowerShell (2/3)
- Parsing Text with PowerShell (3/3)5