ふと、コンソール上で指定した値に近い順で数字をsortしたい場合、どうすればいいかなーと思ったので調べてみた。 指定した値との差分さえ絶対値にすればいいので、そんなに難しい話ではない。とりあえずawkを使ってみる前提(perlとかだとabs関数あるようなので)。で、awkにはabsの関数が無いのだけど、以下のようにすることで絶対値を取得してsortさせることができる。
awk '{x=<NUM>-$0;print $0,(x < 0) ? -x : x}' | sort -k2n | cut -d' ' -f1
blacknon@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
応用すれば、指定した値にからの差分が一定値以内の値(近似値)のみを取得することもできる(やっつけ例)。
blacknon@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