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

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

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

sudo apt-get install rs

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

1.複数の列に分割する

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

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

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」オプションを付与することで、前にこちらでやったのと同じ処理を行える。

コマンド | rs -T

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」オプションを付与するとその要素が足りない部分をループさせて表示させてくれる。

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○ … 最初の○行は無視するが表示させる

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