如何将函数的输出存储到数组中

如何将函数的输出存储到数组中

数据集文件名“demo.txt”

ID|SAL|COL|PER|TAG|GER
1"|"1.11"|"2.22"|"1.1"|"2.2"|D"
2"|"1.234"|"3.234"|"2.2222"|"2.34"|"B"
3"|"1.234"|"35.23"|"3.2"|"2.34"|"A"

我创建了一个函数,它将自动计算小数列总和,下面是我在 main.sh 脚本中调用该函数的函数

demo()
{
FILE_NAME="$1"
COLUMN_NAME="$2"

alpha=( $(awk -F"|" 'NR==1{for(i=1;i<=NF;i++){if ($i ~ /'$COLUMN_NAME'/){print i;}}}' $FILE_NAME) )

for each in "${alpha[@]}"
do
   awk -F'"?\\|"?' '{T+=$('$each')} END { printf "%.2f\n", T }' $FILE_NAME  
done

}

脚本:main.sh

#main.sh 脚本中调用的函数

demo demo.txt 'SAL|COL|PER|TAG'

问题是我如何将输出放入数组中

下面是我需要存储到 array1 中的输出

3.57 40.68 6.52 6.88

第二个数组是下面从另一个程序获得的输出

array2={3.57 40.68 6.52 6.88}

**这样我就可以将 array1 与 array 2 位置值匹配

array1[0] with array2[0] 
array1[1] with array2[1] 
array1[2] with array2[2] 
array1[3] with array2[3] 

如果全部成功应将成功状态显示为 YES

我有部分有效的解决方案...帮助我解决一些问题 这样我就可以将数组的每个值存储到 array1

FILE_NAME="$1"
COLUMN_NAME="$2"

alpha=( $(awk -F"|" 'NR==1{for(i=1;i<=NF;i++){if ($i ~ /'$COLUMN_NAME'/){print i;}}}' $FILE_NAME) )

declare -a array=();

for each in "${alpha[@]}"
do
        #var=($(awk -F'"?\\|"?' '{T+=$('$each')} END { printf "%.2f\n", T }' $FILE_NAME))
        mapfile -t array <<< "$(awk -F'"?\\|"?' '{T+=$('$each')} END { printf "%.2f\n", T }' $FILE_NAME)"
        #awk -F'"?\\|"?' '{T+=$('$each')} END { printf "%.2f\n", T }' $FILE_NAME
done

echo "${array[@]}"

答案1

您的部分工作解决方案的问题是您每次将一列总和中的单个值存储到整个数组中,这会删除以前的值。

解决方案是将值一一填充到数组中,而不是使用需要所有值都在一个输入行上的 mapfile 命令:

FILE_NAME="$1"
COLUMN_NAME="$2"

alpha=( $(awk -F"|" 'NR==1{for(i=1;i<=NF;i++){if ($i ~ /'$COLUMN_NAME'/){print i;}}}' $FILE_NAME) )

declare -a array=()

n=0

for each in "${alpha[@]}"
do
        array[n]="$(awk -F'"?\\|"?' '{T+=$('$each')} END { printf "%.2f\n", T }' $FILE_NAME)"
        ((n=n+1))
done

echo "${array[@]}"

运行这个给出:

$ bash test.sh demo.txt 'SAL|COL|PER|TAG'
3.58 40.68 6.52 6.88

答案2

要将输出放入demo数组中,您可以使用命令替换

declare -a array1=( $(demo) )

demo并用上面的行替换脚本中的调用。

PS:如果输入文件具有固定(且预定义)的列数,则可能更容易将列直接求和到数组元素中(并且可能更快,因为您不需要读取$FILENAME#columns + 1 次)。

相关内容