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 2 cenário:

  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 dos cenários está funcionando.

Maheshwari
fonte
awk '{ split("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 ",arr,","); print arr[1]; }' OU echo "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" | awk '{ split($0,arr,","); print arr[1]; }' Isso deve funcionar.

Respostas:

9

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 no bash? resposta de Johannes Schaub . Verifique as outras respostas lá também.

Esteira
fonte
2

Seu primeiro trecho não se parece com a sintaxe do shell. Está correta a sintaxe Perl.
Seu segundo trecho não é usado cutcorretamente; Não sei o que você pretendia.

O shell possui uma construção de divisão de cadeia interna: quando você escreve $somevarsem aspas, o shell primeiro pesquisa o valor da variável somevar, depois divide esse valor em palavras separadas nos caracteres especificados por IFSe, finalmente, interpreta cada palavra como uma glob padrão (curinga do arquivo). Assim, você pode dividir uma string definindo IFSpara o caractere separador e desligando temporariamente o englobamento.

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

Observe que, se um campo contiver espaço em branco, o elemento da matriz manterá esse espaço em branco. Se você deseja dividir em todos os espaços em branco e vírgulas, defina IFS=', '. Observe que IFSnão é uma string para dividir, mas um conjunto de caracteres para dividir; um espaço ou uma vírgula constituirá um separador. Além disso, existem regras especiais para espaços em branco: qualquer sequência de zero ou mais espaços seguida por 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ê deseja apenas remover os espaços em branco no início ou no final de um campo, precisará fazê-lo elemento a 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
Gilles 'SO- parar de ser mau'
fonte
2
$ set -f  # turn off globbing, so as not to expand wildcards
$ arr=($(echo "$stats" | sed 's/,/ /g'))
$ echo ${arr[1]}
aac-lc
Kyle Jones
fonte
11
Observe que isso tratará os espaços em branco como separadores e vírgulas.
Gilles 'SO- stop be evil'