課題
標準入力を逆順に出力する方法をたくさん知りたい!
入力例は以下とする。
$ 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が王道?