Bagaimana cara membagi output dan menyimpannya dalam array?

9

Ini hasilnya:

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

Saya mencoba dengan 2 skenario:

  1. Menyimpan dalam array

      @arr=split(',',$stats);
      echo "statistics: $stats"
  2. Menyimpan dalam variabel

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

Tapi tidak ada skenario yang berhasil.

Maheshwari
sumber
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]; }' ATAU 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]; }' Ini seharusnya bekerja.

Jawaban:

9

Anda dapat menggunakan sesuatu seperti ini, untuk satu baris 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

Kredit: Membagi string berdasarkan pembatas di bash? jawaban oleh Johannes Schaub . Periksa jawaban lain di sana juga.

Tikar
sumber
2

Cuplikan pertama Anda tidak seperti sintaks shell. Itu sintaks Perl yang benar.
Cuplikan kedua Anda tidak digunakan cutdengan benar; Saya tidak tahu apa yang Anda maksudkan.

Shell memiliki built-in string splitting construct: ketika Anda menulis $somevartanpa tanda kutip, shell pertama-tama mencari nilai variabel somevar, kemudian membagi nilai itu menjadi kata-kata yang terpisah pada karakter yang ditentukan oleh IFS, dan akhirnya mengartikan setiap kata sebagai sebuah bola pola (file wildcard). Jadi, Anda dapat memisahkan string dengan mengatur IFSke karakter pemisah dan untuk sementara mematikan globbing.

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

Perhatikan bahwa jika bidang berisi spasi putih, elemen array akan mempertahankan spasi putih itu. Jika Anda ingin membagi di semua spasi putih dan juga koma, atur IFS=', '. Perhatikan bahwa IFSbukan string untuk dipecah tetapi serangkaian karakter untuk dipecah; baik spasi atau koma akan merupakan pemisah. Selain itu, ada aturan khusus untuk spasi putih: setiap urutan nol atau lebih banyak ruang diikuti oleh koma diikuti oleh nol atau lebih banyak ruang akan membentuk satu pemisah, dan setiap urutan satu atau lebih spasi juga akan membentuk pemisah.

Jika Anda hanya ingin menghapus spasi di awal atau akhir bidang, Anda harus melakukannya elemen demi elemen.

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 'SANGAT berhenti menjadi jahat'
sumber
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
sumber
1
Perhatikan bahwa ini akan memperlakukan spasi putih sebagai pemisah dan juga koma.
Gilles 'SO- stop being evil'