разбирать результат mysql построчно и конвертировать каждую строку в массив - скрипт bash

0

Я использую скрипты bash, и по некоторым причинам я должен использовать только bash, а не php или perl и т.д.

Я получил некоторые результаты от mysql с этим кодом и сохранил их в переменной, получившей result:

result=$(mysql -NB -u "$mysqlUser" -p"$mysqlPass" -D "$mysqlDb" -e "select * from sites" )

и это результат:

1 news.bitcoin.com    NULL 840119 stopped 1509636516 1509636688 0 0 0 0
2 blog.blockchain.com NULL NULL   stopped NULL       0          0 0 0 0

теперь я хочу анализировать эти результаты по строкам и преобразовывать каждую строку в массив и обращаться к ним, например, следующим образом:

echo $results[0,0] # 1
echo $results[0,3] # 840119
echo $results[0,6] # 1509636688
echo $results[1,1] # blog.blockchain.com
echo $results[1,3] # NULL
echo $results[1,6] # 0

Приобретая этот пост, мы можем объявлять массивы через такие понятия, как многомерные.

Не могли бы вы помочь мне в этом вопросе или сообщить мне о любых других возможных способах выполнения этой задачи?

заранее спасибо

  • 0
    Bash изначально не поддерживает многомерные массивы
  • 0
    @Inian да, я знаю. но вы можете объявить массивы через andices как многомерные. например: test[0,1,2]=blabla test[0,1,3]=blabla2 и т. д. ... см .: https://stackoverflow.com/a/31468914/3539776
Показать ещё 5 комментариев
Теги:
arrays

3 ответа

0
Лучший ответ

наконец, моя проблема решена таким образом:

declare -A results
row=0
while read -r line; do
    if [[ -z "${line// }" ]]; then 
        continue
    fi        

    declare -a temp2=($line)


    for (( col=0; col<${#temp2[@]}; col++ ));
    do

       results[$row,$col]=${temp2[$col]}

    done

    results[cols]=$(( ${#temp2[@]}-1 ))

    ((row++))
done <<< "$result"
results[rows]=$row

и результаты:

echo "${results[rows]}" # 2 => array rows count
echo "${results[cols]}" # 10 => array cols count
echo "${results[0,0]}" # 1
echo "${results[0,3]}" # 840119
echo "${results[0,6]}" # 1509636688
echo "${results[1,1]}" # blog.blockchain.com
echo "${results[1,3]}" # NULL
echo "${results[1,6]}" # 0
0

Преобразовать ваш вывод в csv - проверить Как выводить результаты запросов MySQL в формате CSV? Один (не хороший) способ:

csv='echo "${result}" | tr '\t' ',''

Затем сделайте магию:

declare -A output 
IFS=$'\r\n' GLOBIGNORE='*' command eval  'lines=($(echo "${csv}"))'        
for (( i=0; i<${#lines[@]}; i++ ));
do
  IFS=$',' GLOBIGNORE='*' command eval  'oneline=($(echo "${lines[$i]}"))'
  for (( j=0; j<${#oneline[@]}; j++ ));
  do
    output[$i,$j]=${oneline[$j]}
  done
done

И наконец

echo "${output[0,0]}" # 1
echo "${output[0,3]}" # 840119
echo "${output[0,6]}" # 1509636688
echo "${output[1,1]}" # blog.blockchain.com
echo "${output[1,3]}" # NULL
echo "${output[1,6]}" # 0

Имейте в виду все двойные кавычки и фигурные скобки.

Благодаря qaru.site/questions/23640/... и qaru.site/questions/12613/...

  • 0
    Я проверил ваше решение. но все блоки $output были пустыми и не показывали мне никаких значений
  • 0
    Извините, случай, Мишмаш. Попробуй
Показать ещё 1 комментарий
0

Игнорируя паранойю, что поля будут несовместимы, вы можете попробовать просто пройтись по данным и присвоить их грубой силой параллельным массивам.

row=0
declare -a A B C D 
mysql -NB -u "$mysqlUser" -p"$mysqlPass" -D "$mysqlDb" -e "select * from sites" |
while read a b c d # ...
do (( row++ ))
   A[$row]="$a"
   B[$row]="$b"
   C[$row]="$c"
   D[$row]="$d"
done

Пожалуйста, используйте лучшие имена, чем a, b, c... но тогда, если поле 2 является fqdn, вы могли бы сказать

echo ${FQDN[2]} 

чтобы быстро захватить это поле из этой строки. Вся таблица становится доступной сразу... но одна неправильная линия собирается выстрелить вам в ногу.

  • 0
    Ваше решение работает, когда число строк результата mysql является статическим. например только 4 строки. но мои строки результата являются переменными не статическими.
  • 0
    row динамически увеличивается для любого количества строк. Ожидается постоянное количество столбцов, но каждая строка, сколько бы она ни была, анализируется в полях по мере поступления. Как это будет работать только на 4 линии?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню