データセットファイル名「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
2番目の配列は、以下の別のプログラムから得られた出力です。
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
部分的に動作する解決策の問題は、毎回、列合計の単一の値を配列全体に格納して、以前の値を削除することです。
解決策は、すべての値が1つの入力行にある必要があるmapfileコマンドを使用する代わりに、配列に値を1つずつ埋めることです。
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
PS:入力ファイルに固定された(事前定義された)数の列がある場合は、列を配列要素に直接合計する方が簡単になる可能性があります(#columns + 1を読む必要がないため、より速い場合があります)。