Результат 1 массив с значениями

data=$(ffmpeg -i /video.mp4 -vf cropdetect -f null - 2>&1 | 
       awk \'/crop=/ {time=$(NF-2); crop=$NF} END {print time, crop}\')

echo $data | cut -d" " -f1
echo $data | cut -d" " -f2

Результат

t:49.960000 
crop=1920:1072:0:4

Пробую сразу получить результат в качестве массива

eval declare -A data=(`ffmpeg -i /video.mp4 -vf cropdetect -f null - 2>&1 | 
       awk \'/crop=/ {time=$(NF-2); crop=$NF} 
                            END {print "[time]=" time,
                                       "[crop]=" crop}\'`)
                                   
echo ${data[time]}

Не выходит, пустой результат, какие варианты не перепробовал...


Ответы (1 шт):

Автор решения: Pak Uula

Я бы генерировал в awk скрипт, который объявляет переменную и явно присваивает элементы массива:

BEGIN { print "unset data; declare -A data;" } 
/crop=/ {time=$(NF-2); crop=$NF} 
END {
  print "data[time]="time";"; 
  print "data[crop]="crop";"
}

bash этот скрипт выполняет в eval, от чего в нём появляется массив data:

#!/bin/bash

function input {
    ffmpeg -i ./video.mp4 -vf cropdetect -f null - 2>&1
}

function handle {
    awk '
    BEGIN {
        print "unset data; declare -A data;" 
    } 
    /crop=/ {time=$(NF-2); crop=$NF} 
    END {
        print "data[time]="time";"
        print "data[crop]="crop";"
    }
    '
}

script=$( input | handle )

eval "$script"
for key in "${!data[@]}"; do
    val="${data[$key]}"
    echo "\$data[$key] = $val"
done

Результат:

$data[time] = pts:1496648
$data[crop] = crop=1280:720:0:0
→ Ссылка