データ群の列数を自在に調節する(シェルスクリプト)

課題

1列のデータを2列のデータにしたい。具体的には以下のようなイメージ。

$ seq 1 10
1
2
3
4
5
6
7
8
9
10

1 2
3 4
5 6
7 8
9 10

解決策

xargs コマンドを利用すれば良い。

$ seq 1 10 | xargs -n 2
1 2
3 4
5 6
7 8
9 10


xargs と言えば、指定したコマンドに対して標準入力の内容を引数として与えるためのコマンドとして認知されていると思う。 単純なフィルタのコマンドとは少し性質が異なるので、使いこなすまでにやや時間が要るかもしれない(その分、重要度は高い)。

しかし、本記事で紹介するのはこれに対してやや斜め上な利用法である。 xargs に対してコマンドを指定せず、オプションだけを与えている。 コマンドを指定しない場合の動作については、以下のように説明されている。

If utility is omitted, the default shall be the echo utility.

The Open Group xargs

つまり echo が指定された状況と同じ動作をする。 ということは、データ群が何も加工されないまま出力されるということだ。

そして、データ群の列数を変換するキモは xargs の -n オプションである。 これはコマンドに対して引数として与えるデータの数を指定するものである。 ここまで説明すればもう明らかだろう。 echo に対して渡す引数の個数を -n オプションによって指定することで、列数を自在に調節できるのだ。

所感

UNIX的なシェルスクリプトを作成するうえで、データ群の列をいじくることはよくある。 awk を使えば複雑な加工も可能ではあるが、本記事のような機械的な加工が xargs を利用することで簡易的に実現できることは覚えて置く価値はある。 また、本記事の内容以外にも xargs には色々な利用法が考えられるので、別の機会があれば紹介したい。