ふと、コンソール上で指定した値に近い順で数字をsortしたい場合、どうすればいいかなーと思ったので調べてみた。 指定した値との差分さえ絶対値にすればいいので、そんなに難しい話ではない。とりあえずawkを使ってみる前提(perlとかだとabs関数あるようなので)。で、awkにはabsの関数が無いのだけど、以下のようにすることで絶対値を取得してsortさせることができる。
bash
awk '{x=<NUM>-$0;print $0,(x < 0) ? -x : x}' | sort -k2n | cut -d' ' -f1
shellblacknon@BS-PUB-UBUNTU-01:~$ # 5に近い値順にsortをする blacknon@BS-PUB-UBUNTU-01:~$ yes 'echo $((RANDOM%10))' | head -30 | bash | awk '{x=5-$0;print $0,(x < 0) ? -x : x}' | sort -k2n | cut -d' ' -f1 | xargs 5 5 5 5 5 4 4 6 6 6 3 3 3 7 7 7 2 2 2 2 8 8 1 1 9 0 0 0 0 0 blacknon@BS-PUB-UBUNTU-01:~$ blacknon@BS-PUB-UBUNTU-01:~$ # 差分の出力ありの場合(2列目) blacknon@BS-PUB-UBUNTU-01:~$ yes 'echo $((RANDOM%10))' | head -30 | bash | awk '{x=5-$0;print $0,(x < 0) ? -x : x}' | sort -k2n 5 0 5 0 5 0 5 0 4 1 4 1 4 1 4 1 3 2 3 2 3 2 7 2 2 3 2 3 2 3 2 3 8 3 8 3 8 3 8 3 8 3 8 3 1 4 9 4 9 4 9 4 9 4 9 4 0 5 0 5
応用すれば、指定した値にからの差分が一定値以内の値(近似値)のみを取得することもできる(やっつけ例)。
shellblacknon@BS-PUB-UBUNTU-01:~$ yes 'echo $((RANDOM%10))' | head -30 | bash | awk '{x=5-$0;print $0,(x < 0) ? -x : x}' | awk '2>=$2{print}' 5 0 6 1 3 2 3 2 3 2 6 1 4 1 7 2 7 2 4 1 7 2 7 2 3 2 5 0 6 1