Esta parece una pregunta fácil, pero he intentado varios enfoques que he encontrado en otras preguntas pero no he tenido suerte.
Simplemente estoy tratando de usar awk para buscar la cadena (ExAC_ALL =.) Dentro de la octava columna de un archivo txt, sin embargo, el carácter especial "." Parece estar causando problemas.
El código que estoy tratando de usar es
> awk ' ($8 ~ "ExAC_ALL=.") {print $0}' input.txt > output.txt
También he intentado:
> EXAC="ExAC_ALL=."
> awk -v NAME="$EXAC" '$8 ~ NAME { print $0 }' input.txt > output.txt
También he intentado escapar del "." símbolo de múltiples formas.
Cualquier sugerencia sería muy apreciada.
3 respuestas
Solo use una barra invertida simple para escapar del período.
Por ejemplo, considere este archivo de entrada:
$ cat file
ExAC_ALL=1
ExAC_ALL=.
ExAC_ALL=*
Para obtener las líneas que deseas:
$ awk '$1 ~ /ExAC_ALL=\./' file
ExAC_ALL=.
Discusión
Sin la barra diagonal inversa, el punto es un carácter comodín: coincide con cualquier carácter. Así:
$ awk '$1 ~ /ExAC_ALL=./' file
ExAC_ALL=1
ExAC_ALL=.
ExAC_ALL=*
Con la barra invertida, solo coincidirá con un punto.
Alternativa
Alternativamente, uno podría poner el punto entre corchetes:
$ awk '$1 ~ /ExAC_ALL=[.]/' file
ExAC_ALL=.
Para una coincidencia de cadena fija, evite expresiones regulares y use index
: devuelve la posición de coincidencia y 0
si no se encuentra ninguna coincidencia
awk 'index($8, "ExAC_ALL=.")' ip.txt
Para pasar una cadena desde el shell, use la variable de entorno en lugar de la opción -v
, esto evitará las interpretaciones de barra invertida
name="ExAC_ALL=." awk 'index($8, ENVIRON["name"])' ip.txt
Para ex:
$ echo 'a\b' | awk -v s='\b' 'index($1, s)'
$ echo 'a\b' | s='\b' awk 'index($1, ENVIRON["s"])'
a\b
Puedes probar como a continuación
$ EXAC="ExAC_ALL=[.]"
$ awk -v NAME="$EXAC" '$8 ~ NAME { print $0 }' input.txt > output.txt
Nuevas preguntas
unix
Esta etiqueta es EXCLUSIVAMENTE para preguntas de PROGRAMACIÓN que están directamente relacionadas con Unix; los problemas generales de software deben dirigirse al sitio de intercambio de pila de Unix y Linux o al Superusuario El sistema operativo Unix es un sistema operativo de propósito general que fue desarrollado por Bell Labs a fines de la década de 1960 y actualmente existe en varias versiones.