ネットで調べものをしていたところ、Haskellで作られたawkライクに使えるコマンド『hawk』なるものを見かけたので、試してみることにした。
1.インストール
まずはインストールから。
Haskellで作られていることもあって、Cabalからインストールする方法が推奨されている。
まずはHaskellのインストール、cabal updateから。
●Debian/Ubuntu系の場合
sudo apt-get install haskell-platform cabal update
●RHEL系の場合
sudo yum install haskell-platform cabal update
Haskellのインストールが終わったら、以下のコマンドでhawkのインストールを行う。
cabal install haskell-awk
これでhawkがインストールされた。
ただ、インストール先が「~/.cabal/bin/」なので、PATHに追加してやる必要がある。
「.bashrc」などに以下を追記してやる。
PATH=$PATH:~/.cabal/bin export PATH
2.触ってみる
さて、それでは実際に使ってみよう。
基本はawkと同じように使えるのだが、一部の処理は関数として事前に用意されているようだ。
「awk ‘{print $1}’」相当の処理
「awk ‘{print $1}’」相当の処理は、「head」で行える。
hawk -m 'head'
blacknon@BS-PUB-UBUNTU-01:~$ cat /tmp/test.csv id,user,value 1,aaa,1223 2,bbb,3333 3,ccc,855 4,ddd,998 5,eee,24354 6,fff,345 7,ggg,325 8,hhh,22 9,iii,4657 10,jjj,896 blacknon@BS-PUB-UBUNTU-01:~$ cat /tmp/test.csv | awk -F, '{print $1}' id 1 2 3 4 5 6 7 8 9 10 blacknon@BS-PUB-UBUNTU-01:~$ cat /tmp/test.csv | hawk -d, -m 'head' id 1 2 3 4 5 6 7 8 9 10
「head」「tail」コマンド相当の処理
headやtailコマンド相当の処理についても、簡単に行うことができる。
blacknon@BS-PUB-UBUNTU-01:~$ # 頭3行を取得 blacknon@BS-PUB-UBUNTU-01:~$ seq 10 | hawk -a 'L.take 3' 1 2 3 blacknon@BS-PUB-UBUNTU-01:~$ # 頭3行を削除 blacknon@BS-PUB-UBUNTU-01:~$ seq 10 | hawk -a 'L.drop 3' 4 5 6 7 8 9 10 blacknon@BS-PUB-UBUNTU-01:~$ # 末尾3行を抽出(ちょっと面倒) blacknon@BS-PUB-UBUNTU-01:~$ seq 10 | hawk -a 'L.reverse . take 3 . reverse' 8 9 10
値に応じてフィルタリング
値に応じてフィルタリングして抽出させることもできるようだ。
blacknon@BS-PUB-UBUNTU-01:~$ seq 100 | hawk -ad 'L.takeWhile (/="32") . L.dropWhile (/="18")' 18 19 20 21 22 23 24 25 26 27 28 29 30 31
表を反転する
表を反転させることもできる。
hawk -m 'L.reverse'
blacknon@BS-PUB-UBUNTU-01:~$ printf "1 2 3\n4 5 6\n7 8 9\n" 1 2 3 4 5 6 7 8 9 blacknon@BS-PUB-UBUNTU-01:~$ printf "1 2 3\n4 5 6\n7 8 9\n" | hawk -m 'L.reverse' 3 2 1 6 5 4 9 8 7 blacknon@BS-PUB-UBUNTU-01:~$ printf "1 2 3\n4 5 6\n7 8 9\n" | hawk -a 'L.reverse' 7 8 9 4 5 6 1 2 3 blacknon@BS-PUB-UBUNTU-01:~$ printf "1 2 3\n4 5 6\n7 8 9\n" | hawk -m 'L.reverse' | hawk -a 'L.reverse' 9 8 7 6 5 4 3 2 1
その他、hawk内でエイリアスを定義して使ったりと、いろいろな使い方があるようだ。
詳細はこちらのドキュメントかスライドを見るとよいだろう。