標準入力の内容を逆順に出力する(シェルスクリプト)

課題

標準入力を逆順に出力する方法をたくさん知りたい!

入力例は以下とする。

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

解決法

tac を使う

言わずとしれたコマンド。 GNU coreutilsに含まれる。 コマンド名は cat の逆順に由来。 もちろん POSIX 非規定なので注意。

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

tail -r を使う

BSD系の tail コマンドには -r オプションが存在する。 もちろん POSIX 非規定なので注意。

$ seq 1 10 | tail -r
10
9
8
7
6
5
4
3
2
1

awk を使う

ちょっと困ったらとりあえず awk くん。

$ seq 1 10 | awk '{buf[NR]=$0} END{for(i=NR;i>=1;i--){print buf[i]}}'
10
9
8
7
6
5
4
3
2
1

nl と sort を使う

最初にメタ情報を付加して最後にメタ情報を削除する方法。 こういう考え方はけっこう好き。

$ seq 1 10 | nl | sort -k1,1nr | awk '{print $2}'
10
9
8
7
6
5
4
3
2
1

sed を使う

sed 強者ならパターンスペースとホールドスペースを利用して実現可能。 でも気を抜くと意味わからなくなる。

$ seq 1 10 | sed '1!G;$!h;$!d'
10
9
8
7
6
5
4
3
2
1

tr を使う

行指向のデータを列指向のデータに変えてしまう邪道。 データに空白やタブが含まれていたら崩壊。

 seq 1 10 | tr '\n' ' ' | awk '{for(i=NF;i>=1;i--) {print $i}}'
10
9
8
7
6
5
4
3
2
1

所感

やっぱりawkが王道?