ふと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○ … 最初の○行は無視するが表示させる
結構いろいろなトコで使えそうなコマンドなので、有効に活用していきたい。