Wie teile ich die Ausgabe auf und speichere sie in einem Array?

9

Dies ist die Ausgabe:

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

Ich habe es mit 2 Szenarien versucht:

  1. Speichern in einem Array

      @arr=split(',',$stats);
      echo "statistics: $stats"
    
  2. Speichern in einer Variablen

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

Aber keines der beiden Szenarien funktioniert.

Maheshwari
quelle
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]; }' ODER 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]; }' Das sollte funktionieren.

Antworten:

9

Sie können so etwas für eine einzelne Eingabezeile verwenden:

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

Credits: Geteilte Zeichenfolge basierend auf dem Trennzeichen in Bash? Antwort von Johannes Schaub . Überprüfen Sie dort auch die anderen Antworten.

Matte
quelle
2

Ihr erstes Snippet ist nichts anderes als eine Shell-Syntax. Es ist die richtige Perl-Syntax.
Ihr zweites Snippet wird nicht cutrichtig verwendet. Ich weiß nicht, was du beabsichtigt hast.

Die Shell verfügt über ein integriertes Konstrukt zum Teilen von Zeichenfolgen: Wenn Sie $somevarohne Anführungszeichen schreiben , sucht die Shell zuerst nach dem Wert der Variablen somevar, teilt diesen Wert dann in separate Wörter für die durch angegebenen Zeichen auf IFSund interpretiert schließlich jedes Wort als Glob Muster (Datei-Platzhalter). Sie können also eine Zeichenfolge teilen, indem Sie IFSdas Trennzeichen festlegen und das Globbing vorübergehend deaktivieren.

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

Beachten Sie, dass das Array-Element dieses Leerzeichen beibehält, wenn ein Feld Leerzeichen enthält. Wenn Sie sowohl Leerzeichen als auch Kommas aufteilen möchten, setzen Sie IFS=', '. Beachten Sie, dass IFSes sich nicht um eine Zeichenfolge handelt, bei der geteilt werden soll, sondern um eine Reihe von Zeichen, bei denen geteilt werden soll. entweder ein Leerzeichen oder ein Komma bilden ein Trennzeichen. Darüber hinaus gibt es spezielle Regeln für Leerzeichen: Jede Folge von null oder mehr Leerzeichen, gefolgt von einem Komma, gefolgt von null oder mehr Leerzeichen, bildet ein Trennzeichen, und jede Folge von einem oder mehreren Leerzeichen bildet auch ein Trennzeichen.

Wenn Sie Leerzeichen nur am Anfang oder Ende eines Feldes entfernen möchten, müssen Sie dies Element für Element tun.

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 - hör auf böse zu sein'
quelle
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
quelle
1
Beachten Sie, dass Leerzeichen sowohl als Trennzeichen als auch als Kommas behandelt werden.
Gilles 'SO - hör auf böse zu sein'