Como dividir a saída e armazená-la em uma matriz?

9

Esta é a saída:

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

Eu tentei com dois cenários:

  1. Armazenando em uma matriz

      @arr=split(',',$stats);
      echo "statistics: $stats"
    
  2. Armazenando em uma variável

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

Mas nenhum cenário está funcionando.

    
por Maheshwari 29.02.2012 / 07:13

3 respostas

8

Você pode usar algo assim para uma única linha de entrada:

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

Demo:

$ 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

Créditos: Dividir string com base no delimitador em bash? responder por Johannes Schaub . Verifique as outras respostas lá também.

    
por 29.02.2012 / 07:55
2

Seu primeiro trecho não é nada parecido com a sintaxe do shell. É a sintaxe correta do Perl.
Seu segundo trecho não usa cut corretamente; Eu não sei o que você pretendia.

O shell tem uma construção de divisão de cadeia interna: quando você escreve $somevar sem nenhuma aspas, o shell primeiro procura o valor da variável somevar e, em seguida, divide esse valor em palavras separadas nos caracteres especificados por IFS e, finalmente, interpreta cada palavra como um padrão glob (curinga de arquivo). Assim, você pode dividir uma string configurando IFS para o caractere separador e desativando temporariamente a globulação.

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

Observe que, se um campo contiver espaço em branco, o elemento da matriz reterá esse espaço em branco. Se você deseja dividir em todos os espaços em branco e vírgulas, defina IFS=', ' . Observe que IFS não é uma string para dividir, mas um conjunto de caracteres para dividir em; um espaço ou uma vírgula constituirão um separador. Além disso, existem regras especiais para espaços em branco: qualquer sequência de zero ou mais espaços seguida por uma vírgula seguida por zero ou mais espaços constituirá um separador, e qualquer sequência de um ou mais espaços também constituirá um separador.

Se você quiser apenas remover os espaços em branco no início ou no final de um campo, terá que fazer isso elemento por elemento.

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
    
por 29.02.2012 / 21:12
2
$ set -f  # turn off globbing, so as not to expand wildcards
$ arr=($(echo "$stats" | sed 's/,/ /g'))
$ echo ${arr[1]}
aac-lc
    
por 29.02.2012 / 08:06

Tags