次の2つの列を持つテキストファイルがあります。
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)の値のデータ型を保持したいと思います。
計算するには、ファイルの最後まで特定の間隔の2番目の列値を合計する必要があります。たとえば、「(最初の列)関連値29(0.00136893)を最後の関連値まで合計します。
最良のアプローチは何ですか? BashとPythonのソリューションが最も人気があります!
答え1
編集、質問を誤って読み、あなたが尋ねていないことに答えました。熱アイテムが欲しいですか?はい辞書キー?それでは、より多くのデータが到着したら、重複した項目を確認できますか?そうでない場合は、連想配列を必要とせず、通常の索引付けを行うだけです。これにより、どこからでも始めることができます。
BashはFP数学をまったく実行しないので、bash配列にデータを入れることは役に立ちません。 >.<
整数の索引付けが必要で、索引が負になることができない場合は、関連 (文字列索引) 配列ではなく索引配列を使用する必要があります。
ループを使用してwhile read
入力を2つの変数に解析し、それを使用して配列を設定します。
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です。
そしてbash
bc
echo ${arr2[@]} | sed 's/ /+/g' | bc -l
つまり、すべての配列要素(区切り文字でスペースを含む)を印刷し、スペースを「+」に置き換えて、実際の数学演算のためにbc -lに送信します。