コンソール上で指定した数字に近い値順にsortをする

ふと、コンソール上で指定した値に近い順で数字をsortしたい場合、どうすればいいかなーと思ったので調べてみた。
指定した値との差分さえ絶対値にすればいいので、そんなに難しい話ではない。とりあえずawkを使ってみる前提(perlとかだとabs関数あるようなので)。で、awkにはabsの関数が無いのだけど、以下のようにすることで絶対値を取得してsortさせることができる。

awk '{x=<NUM>-$0;print $0,(x < 0) ? -x : x}' | sort -k2n | cut -d' ' -f1
Sponsored Links

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

 


Written by blacknon

インフラエンジニア(…のつもり)。 仕事で使うならクライアントはWindowsよりはUNIXの方が好き。 大体いつも眠い。

Leave a Comment

メールアドレスが公開されることはありません。

*