Як розділити вихід і зберегти його в масиві?


9

Це вихід:

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

Я спробував з 2 сценарію:

  1. Зберігання в масиві

      @arr=split(',',$stats);
      echo "statistics: $stats"
    
  2. Зберігання у змінній

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

Але жоден сценарій не працює.


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]; }' АБО 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]; }' Це повинно працювати.

Відповіді:


9

Ви можете використовувати щось подібне для одного рядка введення:

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

Демонстрація:

$ 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

Кредити: Спліт струни на основі роздільника в bash? відповідь Йоханнеса Шауба . Перевірте й інші відповіді.


2

Ваш перший фрагмент - це не що інше, як синтаксис оболонки. Це правильний синтаксис Perl.
Ваш другий фрагмент не використовується cutправильно; Я не знаю, що ти мав намір.

Оболонка має вбудовану структуру поділу рядків: коли ви пишете $somevarбез жодних лапок, спочатку оболонка шукає значення змінної somevar, потім розбиває це значення на окремі слова на вказані символи IFSта, нарешті, інтерпретує кожне слово як глобус візерунок (файл підстановки). Таким чином, ви можете розділити рядок, встановивши IFSсимвол роздільника і тимчасово відключивши глобус.

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

Зауважте, що якщо поле містить пробіл, елемент масиву збереже цей пробіл. Якщо ви хочете розділити на весь пробіл, а також коми, встановіть IFS=', '. Зауважте, що IFSце не рядок для розділення на, а набір символів, який потрібно розділити на; або пробіл, або кома становлять роздільник. Крім того, існують спеціальні правила для простору пробілів: будь-яка послідовність нульових або більше пробілів, що супроводжується комою, за якою нуль або більше пробілів, становитиме один роздільник, а будь-яка послідовність одного або декількох пробілів також становитиме роздільник.

Якщо ви хочете лише позбавити пробілів на початку або в кінці поля, вам доведеться робити це за елементами.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.