명령 실행의 출력 값을 배열에 저장하려는 시나리오가 있습니다.
아래와 같은 데이터 세트가 있습니다.
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[@]}"
모든 값 대신 하나의 출력 값만 제공됩니다.
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