출력을 분할하여 배열에 저장하는 방법은 무엇입니까? 720,10,0,0,0.000000,30,1280 720 나는 두 가지

이것은 출력입니다.

3,aac-lc, 93.8, aaclc, 77.3, h.264, 1024.6, h.264, 1029.1, 31, 31, 0,0,0.000000,31,31,0,0,0.000000,7,0,0,0.000000,30,1280 720,10,0,0,0.000000,30,1280 720

나는 두 가지 시나리오로 시도했다.

  1. 배열에 저장

      @arr=split(',',$stats);
      echo "statistics: $stats"
  2. 변수에 저장

     echo $stats | cut -d ',' -f | read s1
     echo $s1

그러나 두 시나리오 모두 작동하지 않습니다.



답변

한 줄의 입력에 다음과 같은 것을 사용할 수 있습니다.

IFS="," read -ra arr <<< "$foo"

데모:

$ cat t.sh
foo="3,aac-lc, 93.8, aaclc, 77.3, h.264, 1024.6, ..." # snipped

IFS="," read -ra arr <<< "$foo"
echo ${#arr[@]}
echo ${arr[0]}
echo ${arr[30]}
$ ./t.sh
31
3
1280 720

크레딧 : bash의 구분 기호를 기반으로 분할 문자열? Johannes Schaub의 답변 입니다. 다른 답변도 확인하십시오.


답변

첫 번째 스 니펫은 셸 구문과 다릅니다. 올바른 Perl 구문입니다.
두 번째 스 니펫이 cut올바르게 사용되지 않습니다 . 당신이 의도 한 바를 모르겠습니다.

셸에는 내장 문자열 분리 구문이 있습니다. $somevar따옴표없이 쓰면 셸은 먼저 변수 값을 somevar찾은 다음 해당 값을로 지정된 문자에서 별도의 단어로 분할하고 IFS각 단어를 glob로 해석합니다. 패턴 (파일 와일드 카드). 따라서 IFS구분 문자 로 설정 하고 글 로빙을 일시적으로 해제 하여 문자열을 분할 할 수 있습니다 .

set -f; IFS=,
arr=($stats)
set +f; unset IFS

필드에 공백이 포함되어 있으면 배열 요소는 해당 공백을 유지합니다. 쉼표뿐만 아니라 모든 공백을 나누려면을 설정하십시오 IFS=', '. 주 IFS에서 분할하지만,에서 분할에 문자 집합에 문자열이 아닌; 공백이나 쉼표는 구분 기호를 구성합니다. 또한 공백에는 특별한 규칙이 있습니다. 0 개 이상의 공백 시퀀스, 쉼표, 0 개 이상의 공백 시퀀스는 하나의 구분 기호를 구성하고 하나 이상의 공백 시퀀스도 구분 기호를 구성합니다.

필드의 시작 또는 끝 부분에서 공백 만 제거하려면 요소별로 공백을 제거해야합니다.

shopt -s extglob
for ((i=0; i<${#arr[@]}; i++)); do
  arr[i]=${arr[i]#+( )}   # strip one or more spaces at the beginning
  arr[i]=${arr[i]%+( )}   # strip one or more spaces at the end
done

답변

$ set -f  # turn off globbing, so as not to expand wildcards
$ arr=($(echo "$stats" | sed 's/,/ /g'))
$ echo ${arr[1]}
aac-lc