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[@]}"모든 값 대신 하나의 출력 값만 제공됩니다.

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

관련 정보