Информация о диске для хранения — заменить несколько входных значений в выходной файл

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!

https://downloadcenter.intel.com/download/21129/USB-3-0-Driver-Intel-USB-3-0-eXtensible-Host-Controller-Driver-for-Intel-7-Series-C216-Chipset-Family?product=65855

0
21.06.2019, 12:56
2 ответа

Проблема связана с подстановочным знаком в конце регулярного выражения:

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таблицы увеличивается.

0
28.01.2020, 03:32

Спасибо. Ты прав. '. *' следует заменить на '$'. Теперь работает как надо. Также там же я нашел нужную информацию.

  sed -i -e "s/,${original}$/,${new}/g" "$DIR"/"$name"_output.log;

Спасибо за ваши усилия.

0
28.01.2020, 03:32

Теги

Похожие вопросы