コマンドラインで値のリストを数値で分割する方法は?

コマンドラインで値のリストを数値で分割する方法は?

Unixユーティリティを使用して単純なプログラムをコマンドラインに変換しようとしています。たとえば、周波数リストがある場合(uniqを介してパイピングしてソートした後)

5 x
4 y
1 z

頻度ではなく発生回数の一部を印刷したい。

0.5 x
0.4 y
0.1 z

(これを行うPythonプログラムがありますが、コマンドライン自体で実行できるかどうかを知りたいです。)

これまでの合計を計算してみました。

<...>| awk -F" " '{print $1}' | tr '\n' +; echo 0 | bc

5+1+4+0ただし、これは計算せずに出力のみを提供します。

編集:合計を得ました。上記のコマンドを次のように修正しました。

<...>| awk -F" " '{print $1}' | echo $(tr '\n' +; echo 0) | bc > sum 

正しい結果が合計に保存されます。さて、元のリストを合計で分割して表示したいと思います。

答え1

awk '{ f[$2] = $1; SUM += $1} END { for (i in f) { print f[i]/SUM, i } }' </tmp/data

答え2

awkでは合算ができ、除算もできます。bc各行に追加のデータがあるため、呼び出すよりも簡単です。

これにより、入力行の最初のフィールドの合計が印刷されます。

awk '{sum += $1} END {print $1}'

したがって、入力データを保存して合計を計算し、データ処理を続行できます。

data=$(…)
sum=$(printf '%s\n' "$data" | awk '{sum += $1} END {print $1}')
printf '%s\n' "$data" | awk -v sum="$sum" '{ $1 /= sum; print }'

またはあなたは首都すべてのデータをメモリに保持しながらawkに渡します。

関連情報