背景
使わない人は滅多に使わないcutコマンドだが、cut -f1,2,3,5 みたいにフィールドを指定するだけで、便利に使える。
だがとても残念なことに、フィールドの順序は決められない。例えば、cut -f5,3,2,1としても、cut -f1,2,3,5として扱われる。
対処方法
結論からすると、cut コマンドでフィールドの順序を変える方法はない。
rubyのワンライナー
くそっということで、rubyのワンライナー。
% ruby -ane 'puts [5,3,2,1].map{|i|$F[i-1]}.join("\t")'
ちょっと長いが、スピードはcutより若干早いので、我慢。
追記
2014/07/09 修正:
cut のフィールド指定は、1-originであるのに対して、ruby -a の $Fは、0-originであることを失念。-1を追加修正。
2014/07/14 修正
cut のデフォルトのデリミタはTABに対し、ruby -a は、「空白文字の連続」らしいので、全く同じにするには、デリミタをTABする必要がある。
% ruby -F"_____" -ane 'puts [5,3,2,1].map{|i|$F[i-1]}.join("\t")'
_____は、Ctrl+v TABで入力。
または、
% ruby -ane 'BEGIN{$;=$,="\t"};puts [5,3,2,1].map{|i|$F[i-1]}.join'
だんだん長くなってきた…