Mac/Ubuntuで使えるBSDのテキスト整形用ツール『rs』コマンドを使ってみる

ふとtwitterみてたら、rsコマンドなるものを使って処理しているものがあったので、ちょっと調べつつ使ってみることにした。
どうやらBSDで使われていたデータ処理のコマンドのようで、ちょっとしたバグはあるようだけど、いろんな使い道があるようだ。日本語のmanはこちら

一応Mac OS Xには最初から、Ubuntuには以下のコマンドでインストールすることができる。

bash
sudo apt-get install rs

以下、いくつかの使い方をピックアップする。

1.複数の列に分割する

以前にこちらでも触れたのだが、pasteのように標準出力で受けた列を、複数の列に分割させることができる。

bash
コマンド | rs 行数(0の場合無制限) 列数 # pasteと同じ方向で処理をする コマンド | rs -t 行数(0の場合無制限) 列数 # pasteの逆の方向で処理をする

shell
blacknon@BS-PUB-UBUNTU-01:~$ printf "%d\n" {1..10} 1 2 3 4 5 6 7 8 9 10 blacknon@BS-PUB-UBUNTU-01:~$ printf "%d\n" {1..10} | paste - - 1 2 3 4 5 6 7 8 9 10 blacknon@BS-PUB-UBUNTU-01:~$ printf "%d\n" {1..10} | rs 0 2 1 2 3 4 5 6 7 8 9 10 blacknon@BS-PUB-UBUNTU-01:~$ printf "%d\n" {1..10} | rs -t 0 2 1 6 2 7 3 8 4 9 5 10

2.行と列を入れ替える

rsコマンドでは、「-T」オプションを付与することで、前にこちらでやったのと同じ処理を行える。

bash
コマンド | rs -T

shell
blacknon@BS-PUB-UBUNTU-01:~$ printf "%d\n" {1..10} | rs 0 3 1 2 3 4 5 6 7 8 9 10 blacknon@BS-PUB-UBUNTU-01:~$ printf "%d\n" {1..10} | rs 0 3 | rs -T 1 4 7 10 2 5 8 3 6 9

3.要素を繰り返させる

複数列に分割させた際、もし要素が足りない場合は通常だと空欄になる。
しかし、「-y」オプションを付与するとその要素が足りない部分をループさせて表示させてくれる。

shell
blacknon@BS-PUB-UBUNTU-01:~$ printf "%s\n" {a..z} | rs 0 10 a b c d e f g h i j k l m n o p q r s t u v w x y z blacknon@BS-PUB-UBUNTU-01:~$ printf "%s\n" {a..z} | rs 0 10 -y a b c d e f g h i j k l m n o p q r s t u v w x y z a b c d</pre> # 4.区切り文字の指定 入力の区切り文字を「-c○」、出力の区切り文字を「-C○」で指定することができる。 ```shell blacknon@BS-PUB-UBUNTU-01:~$ printf "%s," {a..z} | rs 0 3 a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z, blacknon@BS-PUB-UBUNTU-01:~$ printf "%s," {a..z} | rs -c, 0 3 a b c d e f g h i j k l m n o p q r s t u v w x y z blacknon@BS-PUB-UBUNTU-01:~$ printf "%s," {a..z} | rs -c, -C$ 0 3 a$b$c$ d$e$f$ g$h$i$ j$k$l$ m$n$o$ p$q$r$ s$t$u$ v$w$x$ y$z$

その他、以下のようなオプションがある。

  • -e … 渡された各行のデータを、すべて一つの配列の値とみなす
  • -k○ … 最初の○行は無視する
  • -K○ … 最初の○行は無視するが表示させる

結構いろいろなトコで使えそうなコマンドなので、有効に活用していきたい。