コマンド実行の出力値を配列に保存するシナリオがあります。
以下のデータセットがあります。
ID|SAL|COST|PER|TAG
1"|"10.1"|"12.22"|"10.1"|"A"
2"|"10.223"|"12.333"|"10.1"|"B"
次のコマンドを実行した後、列出力の合計を次のように取得します。
awk -F"|" 'NR==1{for(i=1;i<=NF;i++){if ($i ~ /SAL|COST/){print i;}}}' demo.txt
2
3
しかし、問題は、生成したい出力を配列に保存する必要があることです。次の方法を使用していますが、動作しません。mapfile -t
mapfile -t array < <(awk -F"|" 'NR==1{for(i=1;i<=NF;i++){if ($i ~ /SAL|COST/){print i;}}}' demo.txt)
印刷すると、echo "${array[@]}"
すべての値の代わりに1つの出力値のみが提供されます。
output:
3
**すべての出力値を印刷する必要があります。配列をエコーするとき**
2
3
答え1
Bashのマニュアルページから:
配列は name=(value1 ... valuen) 複合割り当て形式を使用して割り当てられます。
したがって、次のように割り当てることができます。
myarray=( $(awk -F"|" 'NR==1{for(i=1;i<=NF;i++){if ($i ~ /SAL|COST/){print i;}}}' demo.txt) )
その後、次のようになります。
echo ${myarray[@]}
echo "first: ${myarray[0]}"
echo "second: ${myarray[1]}"
次の出力を提供する必要があります。
2 3
first: 2
second: 3
答え2
Kusalanandaが彼の意見で言ったことを完全に裏付けながら、コマンドを少し修正すると、明らかな問題が解決される可能性があると付け加えます。
$ IFS=$'\n'
$ echo "${array[*]}"
2
3