История изменений
Исправление teod0r, (текущая версия) :
Ради ускорения решил убрать описание из того, что выводит программа в список. Т.е. количество полей в каждой строке одинаковое.
Вот часть списка:
yes acl /my/ 2.3.1-1
yes bash /core/ 5.1.8-1
no bash-completion /opt/ 2.11-1
no crux-bashcompletion /opt/ 20031028-1
yes dcron /core/ 4.5-3
no fcron /opt/ 3.3.0-2
no gdb /opt/ 11.1-1
yes gdbm /core/ 1.21-1
no pkg-get-bashcompletion /opt/ 0.4.5-2
no prt-get-bashcompletion /opt/ 5.19.3-1
no xorg-font-cronyx-cyrillic /xorg/ 1.0.3-1
Целый список сейчас ~1600 строк.
Вот мой первый вариант:
declare -A P
declare -a line list PKG
declare -i i
PKG=(bash acl dcron)
readarray -td$'\n' list < <(prt-cache printf '%i\t%n %p/ %v-%r\n')
for (( i=0; i<${#list[*]}; i++ )) {
line=(${list[i]})
P["${line[1]}"]="${list[i]}"
}
for (( i=0; i<${#PKG[*]}; i++ )) {
printf %s\\n "${P[${PKG[i]}]}"
}
Потом подумал, плохо, что сначала дожидаешься, пока отработает prt-cache в массив, потом тока опять цикл для каждой строки, и для каждой строки создавать массив всей этой строки.
Второй вариант:
declare -A P
declare -a PKG
declare -i i
PKG=(bash acl dcron)
while read -r s name dir ver; do
P["$name"]="$s $name $dir $ver"
done < <(prt-cache printf '%i\t%n %p/ %v-%r\n')
for (( i=0; i<${#PKG[*]}; i++ )) {
printf %s\\n "${P[${PKG[i]}]}"
}
Первый вариант всё-равно быстрее.
Можно ли заменить while read во втором варианте на более быстрый readarray?
Нужно ли менять
line=(${list[i]})
в первом варианте на readaaray? Пробовал, так и не понял, как через readaarray создать массив из другой переменной.Как-то, может, объединить эти два варианта?
Исправление teod0r, :
Ради ускорения решил убрать описание из того, что выводит программа в список. Т.е. количество полей в каждой строке одинаковое.
Вот часть списка:
yes acl /my/ 2.3.1-1
yes bash /core/ 5.1.8-1
no bash-completion /opt/ 2.11-1
no crux-bashcompletion /opt/ 20031028-1
yes dcron /core/ 4.5-3
no fcron /opt/ 3.3.0-2
no gdb /opt/ 11.1-1
yes gdbm /core/ 1.21-1
no pkg-get-bashcompletion /opt/ 0.4.5-2
no prt-get-bashcompletion /opt/ 5.19.3-1
no xorg-font-cronyx-cyrillic /xorg/ 1.0.3-1
Целый список сейчас ~1600 строк.
Вот мой первый вариант:
declare -A P
declare -a line list PKG
declare -i i
PKG=(bash acl dcron)
readarray -td$'\n' list < <(prt-cache printf '%i\t%n %p/ %v-%r\n')
for (( i=0; i<${#list[*]}; i++ )) {
line=(${list[i]})
P["${line[1]}"]="${list[i]}"
}
for (( i=0; i<${#PKG[*]}; i++ )) {
printf %s\\n "${P[${PKG[i]}]}"
}
Потом подумал, плохо, что сначала дожидаешься, пока отработает prt-cache в массив, потом тока опять цикл для каждой строки, и для каждой строки создавать массив всей этой строки.
Второй вариант:
declare -A P
declare -a PKG
declare -i i
PKG=(bash acl dcron)
while read -r s name dir ver; do
P["$name"]="$s $name $dir $ver"
done < <(prt-cache printf '%i\t%n %p/ %v-%r\n')
for (( i=0; i<${#PKG[*]}; i++ )) {
printf %s\\n "${P[${PKG[i]}]}"
}
Первый вариант всё-равно быстрее.
Можно ли заменить while read во втором варианте на более быстрый readarray?
Нужно ли менять
line=(${list[i]})
в первом варианте на readaaray? Пробовал, так и не понял, как через readaarray создать массив из другой переменной.Как-то, может, объединить эти два варианта?
Исходная версия teod0r, :
Ради ускорения решил убрать описание из того, что выводит программа в список. Т.е. количество полей в каждой строке одинаковое.
Вот часть списка:
yes acl /my/ 2.3.1-1
yes bash /core/ 5.1.8-1
no bash-completion /opt/ 2.11-1
no crux-bashcompletion /opt/ 20031028-1
yes dcron /core/ 4.5-3
no fcron /opt/ 3.3.0-2
no gdb /opt/ 11.1-1
yes gdbm /core/ 1.21-1
no pkg-get-bashcompletion /opt/ 0.4.5-2
no prt-get-bashcompletion /opt/ 5.19.3-1
no xorg-font-cronyx-cyrillic /xorg/ 1.0.3-1
Целый список сейчас ~1600 строк.
Вот мой первый вариант:
declare -A P
declare -a line list PKG
declare -i i
PKG=(bash acl dcron)
readarray -td$'\n' list < <(prt-cache printf '%i\t%n %p/ %v-%r\n')
for (( i=0; i<${#list[*]}; i++ )) {
line=(${list[i]})
P["${line[1]}"]="${list[i]}"
}
for (( i=0; i<${#PKG[*]}; i++ )) {
printf %s\\n "${P[${PKG[i]}]}"
}
Потом подумал, плохо, что сначала дожидаешься, пока отработает prt-cache в массив, потом тока опять цикл для каждой строки, и для каждой строки создавать массив всей этой строки.
Второй вариант:
declare -A P
declare -a PKG
declare -i i
PKG=(bash acl dcron)
while read -r s name dir ver; do
P["$name"]="$s $name $dir $ver"
done < <(prt-cache printf '%i\t%n %p/ %v-%r\n')
for (( i=0; i<${#PKG[*]}; i++ )) {
printf %s\\n "${P[${PKG[i]}]}"
}
Первый вариант всё-равно быстрее.
Можно ли заменить while read во втором варианте на более быстрый readarray?
Нужно ли менять
line=(${list[i]})
в первом варианте на readaaray? Пробовал, так и не понял, как через readaarray создать массив из другой переменной.Как-то, может, объединить эти два варианта?