awkコマンドの出力をLinuxアレイに割り当てる

awkコマンドの出力をLinuxアレイに割り当てる

コマンド実行の出力値を配列に保存するシナリオがあります。

以下のデータセットがあります。

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

関連情報