LINUX.ORG.RU

История изменений

Исправление 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 создать массив из другой переменной.
Как-то, может, объединить эти два варианта?