@ karakfa уже показал лучший способ сделать это в awk
;Я хотел бы попытаться исправить версию Bash. Основная проблема - некоторые основные синтаксические ошибки:
Во-первых, в цикле:
for ((i=0; i<=${#args}; i++)) do
${#args}
не получает количество элементов в массиве, оно получает длину (в символах) первого элемента массива. Вы хотите ${#args[@]}
вместо этого. Или, что еще лучше, вообще не перебирайте индексы массива, просто перебирайте элементы массива напрямую:
for input in "${args[@]}"; do
Второй и третий, в строках расчета, например
sumx= $(echo "scale=3; sumx + X[$k]" | bc -l)
... нельзя ставить пробелы после знака =
(они полностью меняют значение команды ), а также ссылки на переменные требуют $
(и ${}
для массиваэлемент), чтобы сказать оболочке заменить их:
sumx=$(echo "scale=3; $sumx + ${X[$k]}" | bc -l)
Это то, что вызывало сообщения об ошибках, которые вы получили. bc
не имеет представления о переменных оболочки;он будет обрабатывать sumx
как неинициализированную переменную bc
, но X[1]
является недопустимым синтаксисом bc
(обратите внимание, что $k
будет заменен).
Если бы вы действительно делали это в оболочке (а не awk
), я бы также предложил упростить ее, удалив массивы. Нет смысла читать содержимое файлов в массив, а затем выполнять итерации по массиву, когда вы можете просто вычислить, как вы читаете:
while IFS=: read x y; do
sumx=$(echo "scale=3; $sumx + $x" | bc -l)
sumx2=$(echo "scale=3; $sumx2 + $x^2" | bc -l)
sumy=$(echo "scale=3; $sumy + $y" | bc -l)
sumxy=$(echo "scale=3; $sumxy + $x*$y" | bc -l)
done < "$input"