ネットで調べものをしていたところ、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内でエイリアスを定義して使ったりと、いろいろな使い方があるようだ。
詳細はこちらのドキュメントスライドを見るとよいだろう。