, поскольку ваши исходные теги включают bash, вот пример с bash
и bc
-инструментом (не однострочным кодом, но иногда с надеждой изучить bash):
# only if needed in a short variable, later possible to test if exist, readable, ...
in=/path/to/your/testfile.txt
# we build a loop over your keys, possible
# - for fixed length files and a fixed byte position
# cut -b 5-10
# - for variable blocked with one (ore more) spaces as delimiter
# sed -e 's/ */ /g' | cut -d ' ' -f 2
for key in $(cat $in | cut -b 5-10 | sort -u) ; do
# initialize counter for summary and number of elements per key
s=0; a=0
# grep all your relevant data from your inputfile (only for the key)
# depends on your data you can grep on bytes (here from start of line with 4
# characters and from byte 5-10 with your key)
for x in $(grep -E "^.{4}${key}" $in | sed -e 's/ */ /g' | cut -d' ' -f4) ; do
# count sum and add 1 to the number of entries
s=$(echo "$s+$x" | bc --mathlib)
((a++))
done
# now print your key (as integer) and avg (as float with 6 decimals)
printf "%i %.6f\n" $key $(echo "$s/$a" | bc --mathlib)
done
bc
используется с параметром --mathlib
с использованием шкалы 20. При необходимости или по вашему желанию вы можете использовать более высокую шкалу и уменьшать десятичные дроби только при печати результата.
Это решение с двумя циклами (одно для ключей, а другое для ключа) допустимо только в том случае, если количество белья в файле ввода не слишком велико (я не использую этот пример для миллиона строк), но оно более читабельно. как некоторый однострочный код (особенно для начинающих).