循环列并将值存储到关联数组

循环列并将值存储到关联数组

我有一个包含两列的文本文件,如下所示:

26 0.000342231
27 0.000342231
28 0.000684463
29 0.00136893
30 0.00102669
31 0.00308008
32 0.00308008
33 0.00444901
34 0.00718686
35 0.00718686
36 0.0109514
37 0.0123203
...

我想循环文本文件并将每列值存储到关联数组 - 类似于字典。如果可能的话,我想保留每列中值的数据类型(int 和 float)。

对于计算,我需要对特定间隔的第二列值进行求和,直到文件末尾,例如“将 29 的(第一列)关联值 (0.00136893) 向下求和到最后一个关联值”

最好的方法是什么? Bash 和 python 解决方案最受欢迎!

答案1

编辑,我误读了问题并回答了您没有问的问题。您是否希望列条目字典键?那么当更多数据到达时您可以检查重复项吗?如果没有,则不需要关联数组,只需普通索引即可。这将让您从任何地方开始。

Bash 根本不进行 FP 数学运算,因此将数据放在 bash 数组中是没有用的。 >.<

如果您想要整数索引,并且索引不能为负数,那么您应该使用索引数组,而不是关联(字符串索引)数组。

使用while read循环将输入解析为两个变量,然后用它们设置一个数组。

declare -a arr
# declare -A arr  # associative

while read c1 c2 leftovers;do
    arr[c1]=$c2;
done < file.txt

echo "arr[4] == ${arr[4]}"

您实际上并不需要declare -a,您可以开始使用它。另请注意,“${#arr}”是数组中集合元素的数量,不是必然是最后一个索引。 (用于arr[-1]访问最后一个元素。) "${!arr[@]}"是索引(键)列表。

当然,所有其他内容也来自 bash 手动工作。

答案2

bash

arr1=( $( cut -d' ' -f1 file ) )
arr2=( $( cut -d' ' -f2 file ) )

即,cut -f使用空格作为分隔符,生成 1(或 2)-d,并将输出分配给数组。

bash 不区分变量的数据类型,任何数组的第一个索引号都是 0。

bashbc

echo ${arr2[@]} | sed 's/ /+/g' | bc -l

即打印所有数组元素(以空格作为分隔符),用“+”替换空格,发送到 bc -l 进行实际的数学运算。

相关内容