¿Cómo dividir la salida y almacenarla en una matriz?

9

Esta es la salida:

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

Intenté con 2 escenarios:

  1. Almacenar en una matriz

      @arr=split(',',$stats);
      echo "statistics: $stats"
  2. Almacenar en una variable

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

Pero ninguno de los escenarios está funcionando.

Maheshwari
fuente
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]; }' O 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]; }' esto debería funcionar.

Respuestas:

9

Puede usar algo como esto, para una sola línea de entrada:

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

Manifestación:

$ 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: ¿ Cadena dividida basada en delimitador en bash? Respuesta de Johannes Schaub . Verifique las otras respuestas allí también.

Estera
fuente
2

Su primer fragmento no es nada como la sintaxis de shell. Es la sintaxis correcta de Perl.
Su segundo fragmento no se usa cutcorrectamente; No sé lo que pretendías.

El shell tiene una construcción de división de cadenas incorporada: cuando escribe $somevarsin comillas, el shell primero busca el valor de la variable somevar, luego divide ese valor en palabras separadas en los caracteres especificados por IFS, y finalmente interpreta cada palabra como un globo patrón (comodín de archivo). Por lo tanto, puede dividir una cadena configurando IFSel carácter separador y desactivando temporalmente el globbing.

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

Tenga en cuenta que si un campo contiene espacios en blanco, el elemento de matriz retendrá ese espacio en blanco. Si desea dividir en todos los espacios en blanco, así como las comas, establezca IFS=', '. Tenga en cuenta que IFSno es una cadena para dividir sino un conjunto de caracteres para dividir; un espacio o una coma constituirán un separador. Además, existen reglas especiales para los espacios en blanco: cualquier secuencia de cero o más espacios seguida de una coma seguida de cero o más espacios constituirá un separador, y cualquier secuencia de uno o más espacios también constituirá un separador.

Si solo desea eliminar espacios en blanco al principio o al final de un campo, deberá hacerlo 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
Gilles 'SO- deja de ser malvado'
fuente
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
fuente
1
Tenga en cuenta que esto tratará los espacios en blanco como separadores y comas.
Gilles 'SO- deja de ser malvado'