Как разделить вывод и сохранить его в массиве?

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
Жиль "ТАК - перестань быть злым"
источник
2
$ set -f  # turn off globbing, so as not to expand wildcards
$ arr=($(echo "$stats" | sed 's/,/ /g'))
$ echo ${arr[1]}
aac-lc
Кайл Джонс
источник
1
Обратите внимание, что это будет рассматривать пробелы как разделители, а также запятые.
Жиль "ТАК - перестать быть злым"