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.

1
emily 16 ene. 2018 a las 07:16

3 respuestas

La mejor respuesta

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=.
2
John1024 16 ene. 2018 a las 04:20

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
0
Sundeep 16 ene. 2018 a las 05:42

Puedes probar como a continuación

$ EXAC="ExAC_ALL=[.]" 
$ awk -v NAME="$EXAC" '$8 ~ NAME { print $0 }'  input.txt > output.txt
1
Akshay Hegde 16 ene. 2018 a las 04:24
48274010