Una publicación anterior, pero acabo de solucionar un problema similar. Mi usb 2.0 yeti mike y g13 game pad no funcionaron en mi invitado win 7 recién instalado, pero funcionaron bien en un invitado win 7 inflado que eliminé. Me tiré de los pelos durante días para solucionar problemas de vb, configuraciones de sonido, configuraciones de usb, etc. Finalmente, vi una publicación aquí sobre los controladores usb 3.0 que descargué directamente de Intel. Puf... problema resuelto. ¡El concentrador USB estaba conectado a un puerto USB 3 y no me di cuenta de que había instalado los controladores desde un disco de configuración mobo!
¡Cualquiera que use un invitado win 7, descargue los controladores usb 3!
Проблема связана с подстановочным знаком в конце регулярного выражения:
s/,${original}.*/,${new}/g
.*
будет соответствовать 110 11 или 1, которые идут первыми в вашей replaceTier
таблице, поэтому 110 будет преобразовано в T1 (из 1 :отображения T1 ), а не T0.
Вместо этого вы хотите выполнить полное соответствие числа для перевода, поэтому отбросьте .*
и добавьте якорь $
(, соответствующий концу строки ), чтобы убедиться, что только точное число будет соответствовать:
s/,${original}\$/,${new}/g
Кстати, я думаю, что ваш анализ файла журнала слишком сложен. Вот как я бы это сделал, предполагая, что вы используете bash
для скрипта:
while read -r displayName; do
# Read two more rows of data from the
# input file.
read -r sizeInKB # ignored
read -r dpPoolID
# Process displayName, remove everything
# up to the first ":", then drop the
# remaining ":" in the middle.
displayName=${displayName#*:}
displayName=${displayName/:/}
# Look up dpPoolID in replaceTier.
tier=""
for row in "${replaceTier[@]}"; do
# Split row into id:tier.
id=${row%%:*}
if [[ "$dpPoolID" = "$id" ]]; then
tier=${row#*:}
break
fi
done
if [[ -n "$tier" ]]; then
# Only print when tier was found, so skip
# invalid dpPoolIDs such as -1, etc.
printf "%s,%s\n" "$displayName" "$tier"
fi
done <"$DIR"/"$name"_disks.log >"$DIR"/"$name"_output.log
Это не только позволяет избежать многократного чтения и записи одного и того же файла, но также использует только bash
встроенные -модули ins (нет grep
, sed
, cut
,xargs
)так много накладные расходы на порождение внешних процессов также исчезли.
Но даже в этом случае есть возможности для улучшения, используя ассоциативный массив для replaceTier
, и в этом случае вы можете выполнять прямой поиск, а не полностью проходить его по каждой строке.
Такой ассоциативный массив можно определить с помощью:
replaceTier=(
[1]=T1
[12]=T1
[13]=T1
[14]=T1
...
[100]=T1
[2]=T2
[21]=T2
...
[24]=T2
[3]=T3
[10]=T0
[110]=T0
[90]=SVC_T1
[91]=SVC_T2
[92]=SVC_T1
)
В этом случае этот самый внутренний цикл for
может быть упрощен до прямого поиска:
tier=${replaceTier[$id]}
Это также было бы более эффективным, особенно если размер вашей replaceTier
таблицы увеличивается.