출력을 분할하여 배열에 저장하는 방법은 무엇입니까?

출력을 분할하여 배열에 저장하는 방법은 무엇입니까?

출력은 다음과 같습니다.

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
    

그러나 두 경우 모두 작동하지 않습니다.

답변1

한 줄 입력의 경우 다음과 같이 사용할 수 있습니다.

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의 구분 기호를 기준으로 문자열을 분할합니까?응답자요하네스 샤웁. 다른 답변도 확인하십시오.

답변2

첫 번째 스니펫은 셸 구문과 완전히 다릅니다. 이것은 올바른 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

답변3

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

관련 정보