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に渡します。。