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
while read -r id pos; do FOO; done <file1
:esto lee file1
lí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 FOO
para cada línea. awk -v id="$id" -v pos="$pos" 'BAR' <file2
:para cada línea de file1
, ejecutaremos un comando awk
que ejecutará BAR
. Esto buscará file2
para las partes coincidentes. Necesitamos decirle a este script awk
las dos variables "externas" del shell. es decir, a la variable awk id
se le asigna el mismo valor que a la variable de shell $id
, y lo mismo para la variable awk pos
y 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 $1
de file2
es el mismo que el id
de la línea actual de file1
, Y si pos
está entre el 4 $4
y el 5 $5
campos 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 gensub
primero. 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 1
significa reemplazar la primera aparición, aunque esto no tiene mucho sentido, ya que asumo que solo habrá una coincidencia de gene=
por línea. 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 awk
con -F'\t'
.
Вы не можете изменить вывод lsusb
с помощью udev
.
На самом деле, вы не можете изменить вывод lsusb
вообще, имена сообщаются самими USB-устройствами.
В то время как lsusb
показывает только имя устройства по идентификатору производителя и модели (в моей системе, в/usr/lib/udev/hwdb.d/*usb*
)вы потенциально можете изменить имена устройств, фактически вы изменили идентификатор карты ALSA.
Вы можете проверить его с помощью aplay -L
или /proc/asound/cards
и использовать его в качестве имени устройства.
См.https://www.alsa-project.org/wiki/Changing_card_IDs_with_udev