Я использую скрипты 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
Приобретая этот пост, мы можем объявлять массивы через такие понятия, как многомерные.
Не могли бы вы помочь мне в этом вопросе или сообщить мне о любых других возможных способах выполнения этой задачи?
заранее спасибо
наконец, моя проблема решена таким образом:
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
Преобразовать ваш вывод в 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/...
$output
были пустыми и не показывали мне никаких значений
Игнорируя паранойю, что поля будут несовместимы, вы можете попробовать просто пройтись по данным и присвоить их грубой силой параллельным массивам.
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]}
чтобы быстро захватить это поле из этой строки. Вся таблица становится доступной сразу... но одна неправильная линия собирается выстрелить вам в ногу.
row
динамически увеличивается для любого количества строк. Ожидается постоянное количество столбцов, но каждая строка, сколько бы она ни была, анализируется в полях по мере поступления. Как это будет работать только на 4 линии?
test[0,1,2]=blabla test[0,1,3]=blabla2
и т. д. ... см .: https://stackoverflow.com/a/31468914/3539776