PowerShellで123ダー!を読んで、いきなり目から鱗が落ちました。
そうか!
こう書けばawkとPowerShellはよく似ているんだ!
awkの場合 §
S:\>type delme.txt|gawk "{print $0}; BEGIN { print 1 }; END { print 2 }"
1
abc
def
ghi
2
S:\>
PowerShellの場合 §
PS S:\> type delme.txt|foreach { $_ } -Begin { 1 } -End { 2 }
1
abc
def
ghi
2
PS S:\>
awkではなくPowerShellを使う長所 §
- 進化が止まっていろいろ使い勝手に不都合のあるawkを使う苦痛から解放される
- Windows 7には標準で入っていて、どの環境でもすぐ使える (この点は特に重要)
- しかも統合開発環境であるISEまでWindows 7に入っている
- 上記の例を見ると、全体の文字数がより少なくて済んでいる。パワーアップした代償により多くの文字を打たされる……というわけでは、必ずしもない
- キーワードとしてのForEach-Objectは長いが、実はTabキーの補完が使えるし、aliasのforeachでも良いのでさほど負担にならない
- もちろん、PowerShellの方がはるかに新しくパワーも大きい。awkや正規表現で上手く扱えないパターンでも、PowerShellではシンプルに扱えるケースも多い
- シェルのスクリプトに誰も万能であることを求めないので、機能過多に進化して破綻するリスクが少ない (言語であるawkに万能を求めて手軽さを失ったのがPerlとも言える)
感想 §
実は自分の中で1つの盲点があったことに気づきました。つまり、シェルの後継はシェル、言語の後継は言語という思いこみがありました。しかし、PowerShell自身が正規表現も扱える以上(たとえばwhere { $_ -match "[ad].." })、awk相当の機能はおおむねPowerShellで満たすことができることになります。これでもう、どれを選んでも何らかの問題があるLL言語の混迷とサヨナラして、awk後継言語の選定に終止符を打てます。
更に言えば、乗り換える契機を見いだしにくかったcmd.exeからPowerShellに本格移行するタイミングが明確に見えた感じがあります。バッチの代わりにPowerShellで書くと思えばメリットが見いだしにくいわけですが、awkの代わりにPowerShellで書くと思えばメリットがはっきりと見えます。