Вычислить среднее значение и стандартное отклонение между аналогичными отформатированными файлами csv и вывести в другой файл в следующем формате

Это связано с тем, что расширение $variableвнутри документа sshрасширяется локальной оболочкой на локальном компьютере, а не в удаленной оболочке. Как правило, мы избегаем последовательностей расширения, т. е. расширения переменной $varкак \$varи подстановок команд как \$(..)вместо $(..), если мы ожидаем, что расширение произойдет в удаленной оболочке.

Таким образом, в вашем цикле forразделение на ,происходит с вашей командой sed, но ваше расширение "$i"снова произойдет в локальной оболочке, что должно было происходить в удаленной оболочке. Из-за отсутствия подходящих escape-последовательностей, echo "$i"никогда не увидит значение в локальной оболочке.

Вы можете обойти это, пометив $iкак \$i, чтобы расширение происходило удаленно. Кроме того, цикл for i in $(echo $variable | sed sed "s/,/ /g")является чрезвычайно хрупким способом перебора списка, разделенного на de -limiter ,. Используйте встроенную оболочку -ins, в данном случае read

.
ssh -i my.pem -p 2022 ec2-user@ip-address 'bash -s' <<EOF
echo "input $variable"
IFS="," read -ra split <<<"$variable"
for var in "\${split[@]}"; do
    printf '%s\n' "\$var"
done
EOF

Обратите внимание на использование escape-последовательностей вокруг расширения массива, "\${split[@]}"и переменной "\$var", которая обеспечивает удаленное расширение этих переменных, а не на локальном компьютере.

0
10.11.2021, 21:54
1 ответ

Вы можете использовать Миллер .

В примере, начиная с

a,v1,v2,v3
a,25,56,23
b,58,56,23

можешь бежатьmerge-fields

mlr --csv merge-fields -a mean,stddev -r "v[0-9]" -o "result" -k input.csv >output.csv

иметь

а v1 v2 v3 результат _среднее значение результат _стандартное отклонение
и 25 56 23 34,666667 18.502252
б 58 56 23 45,666667 19.655364
3
11.11.2021, 07:42

Теги

Похожие вопросы