如何在命令行中将值列表除以数字?

如何在命令行中将值列表除以数字?

我正在尝试使用 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 

正确的结果存储在 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 中进行一次传递,保留内存中的所有数据

相关内容