きっかけ
タイトルにある通りある時ふとある整数に対する約数の一覧が欲しくなった時があった。そこでシェル芸でできないか試行錯誤してみた。
結果
$ yes 220 | head -n220 | awk '{print $1/NR}' | grep -vF --line-buffered . | tac
1
2
4
5
10
11
20
22
44
55
110
220
なんとか出来た。
解説
まずyesで求めたい整数を出力してheadでその整数と同じ数だけの行を取得、
$ yes 10 | head -n10
10
10
10
10
10
10
10
10
10
10
次にawkを使ってそれぞれの行番号を使って出力された整数を割っていきます。
$ yes 10 | head -n10 | awk '{print $1/NR}'
10
5
3.33333
2.5
2
1.66667
1.42857
1.25
1.11111
1
そして小数点が含まれているものを除外するためにgrepの-v(パターンに一致しない行を表示)と-F(固定文字列の検索)を使います。(–line-bufferedはバッファさせないために指定しています。)
$ yes 10 | head -n220 | awk '{print $1/NR}' | grep -vF --line-buffered .
10
5
2
1
最後にtacで逆順に表示すれば上から順に小→大の順に表示されます。
$ yes 10 | head -n220 | awk '{print $1/NR}' | grep -vF --line-buffered . | tac
1
2
5
10
…ただこれがどんな場面で活躍するかは謎。