Come dividere l'output e memorizzarlo in un array?


9

Questo è l'output:

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

Ho provato con 2 scenari:

  1. Archiviazione in un array

      @arr=split(',',$stats);
      echo "statistics: $stats"
  2. Archiviazione in una variabile

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

Ma nessuno scenario funziona.


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]; }' Questo dovrebbe funzionare.

Risposte:


9

Puoi usare qualcosa del genere, per una singola riga di input:

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

Riconoscimenti: dividere la stringa in base al delimitatore in bash? risposta di Johannes Schaub . Controlla anche le altre risposte lì.


2

Il tuo primo frammento non assomiglia affatto alla sintassi della shell. È la sintassi Perl corretta.
Il secondo frammento non viene utilizzato cutcorrettamente; Non so cosa intendevi.

La shell ha un costrutto di suddivisione delle stringhe incorporato: quando scrivi $somevarsenza virgolette, la shell cerca prima il valore della variabile somevar, quindi divide quel valore in parole separate sui caratteri specificati da IFS, e infine interpreta ogni parola come un glob modello (file jolly). Quindi puoi dividere una stringa impostando IFSil carattere separatore e disattivando temporaneamente il globbing.

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

Notare che se un campo contiene spazi bianchi, l'elemento array manterrà quello spazio bianco. Se si desidera dividere in tutti gli spazi bianchi e tra virgole, impostare IFS=', '. Nota che IFSnon è una stringa in cui dividere, ma un insieme di caratteri in cui dividere; uno spazio o una virgola costituiranno un separatore. Inoltre, ci sono regole speciali per gli spazi bianchi: qualsiasi sequenza di zero o più spazi seguita da una virgola seguita da zero o più spazi costituirà un separatore e qualsiasi sequenza di uno o più spazi costituirà anche un separatore.

Se vuoi solo eliminare gli spazi all'inizio o alla fine di un campo, dovrai farlo elemento per 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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.