Переименовать звуковое устройство USB

Suponiendo que tiene un espacio en blanco como delimitador:

$ while read -r id pos; do awk -v id="$id" -v pos="$pos" '$1 == id && pos > $4 && pos < $5 { print gensub(/.*gene=([A-Za-z0-9]*).*/, "\\1", 1) }' <file2; done <file1
LOC102908761
Rftn1
LOC102913870

Explicación

  • while read -r id pos; do FOO; done <file1:esto lee file1línea por línea y coloca el primer campo (p.NW_006502347.1)en la variable de shell $id, y el segundo campo (, p.316684)en la variable de shell $pos. Luego ejecuta FOOpara cada línea.
  • awk -v id="$id" -v pos="$pos" 'BAR' <file2:para cada línea de file1, ejecutaremos un comando awkque ejecutará BAR. Esto buscará file2para las partes coincidentes. Necesitamos decirle a este script awklas dos variables "externas" del shell. es decir, a la variable awk idse le asigna el mismo valor que a la variable de shell $id, y lo mismo para la variable awk posy la variable de shell $pos.
  • $1 == id && pos > $4 && pos < $5:esta es la parte "condicional" del script awk. Si se cumplen estas condiciones, se ejecutarán los siguientes comandos. Aquí, estamos comprobando si el primer campo $1de file2es el mismo que el idde la línea actual de file1, Y si posestá entre el 4 $4y el 5 $5campos de file2.
  • { print gensub(/.*gene=([A-Za-z0-9]*).*/, "\\1", 1) }:si se cumplen las condiciones anteriores, se ejecutará este código. Queremos hacer una sustitución con gensubprimero. Esto busca gene=seguido de una cadena alfanumérica de cualquier longitud ([A-Za-z0-9]*). Esta cadena alfanumérica es (capturada )por los paréntesis. También "buscaremos" todos los caracteres antes y después .*de la cadena completa gene=([A-Za-z0-9]*). Por lo tanto, esto "busca" la línea completa, que se reemplaza con el (primer y único )grupo de captura "\\1", es decir, la cadena alfanumérica después de gene=. El final 1significa reemplazar la primera aparición, aunque esto no tiene mucho sentido, ya que asumo que solo habrá una coincidencia de gene=por línea.

Pestaña -versión delimitada

Prefiero usar archivos delimitados por tabuladores -en general, especialmente para lo que supongo que es un archivo GFF/GTF. Esto permite diferenciar entre espacios, especialmente en el campo 9.

while IFS=$'\t' read -r id pos; do awk -F'\t' -v id="$id" -v pos="$pos" '$1 == id && pos > $4 && pos < $5 { print gensub(/.*gene=([A-Za-z0-9]*).*/, "\\1", 1) }' <file2.tsv ; done <file1.tsv

Las modificaciones al script están dividiendo explícitamente las líneas de shell en las pestañas con IFS=$'\t'y las líneas awkcon -F'\t'.

3
06.09.2018, 21:31
2 ответа

Вы не можете изменить вывод lsusbс помощью udev.

На самом деле, вы не можете изменить вывод lsusbвообще, имена сообщаются самими USB-устройствами.

2
28.04.2021, 23:42

В то время как lsusbпоказывает только имя устройства по идентификатору производителя и модели (в моей системе, в/usr/lib/udev/hwdb.d/*usb*)вы потенциально можете изменить имена устройств, фактически вы изменили идентификатор карты ALSA.

Вы можете проверить его с помощью aplay -Lили /proc/asound/cardsи использовать его в качестве имени устройства.

См.https://www.alsa-project.org/wiki/Changing_card_IDs_with_udev

0
28.04.2021, 23:42

Теги

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