함수의 출력을 배열에 저장하는 방법

함수의 출력을 배열에 저장하는 방법

데이터 세트 파일 이름 "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을 array2 위치 값과 일치시킬 수 있도록

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스크립트의 호출을 위 줄로 바꿉니다.

$FILENAME추신: 입력 파일에 고정된(미리 정의된) 개수의 열이 있는 경우 열을 배열 요소로 직접 합산하는 것이 더 쉬울 수 있습니다( #columns + 1 번 읽을 필요가 없으므로 더 빠를 수도 있습니다 ).

관련 정보