web-dev-qa-db-ja.com

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

UNIXユーティリティを使用して簡単なプログラムをコマンドラインに変換しようとしています。たとえば、頻度リストがある場合(uniqとsortをパイプ処理した後)

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 

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

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

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でシングルパスを作成し、すべてのデータをメモリに保持する の場合もあります。