¿Cómo usar expresiones regulares como separador de campo en awk?

Estoy tratando de usar regex como un separador de campo en awk. Según mi lectura, esto parece posible, pero No puedo obtener la sintaxis correcta.

rpm -qa | awk "{ "FS == [0-9]" ; print $1 }" awk: cmd. line:1: { FS awk: cmd. line:1: ^ unexpected newline or end of string 

¿Pensamientos? El objetivo, si no obvio, es obtener una lista de software sin número de versión.

Respuesta

Has estropeado las comillas y la sintaxis. Para configurar el separador de campo de entrada, la forma más sencilla de hacerlo es con la opción -F en la línea de comando:

awk -F "[0-9]" "{ print $1 }" 

o

awk -F "[[:digit:]]" "{ print $1 }" 

Esto usaría cualquier dígito como separador de campo de entrada y luego generaría el primer campo de cada línea.

Las expresiones [0-9] y [[:digit:]] no son del todo iguales, según la configuración regional. Consulte « Diferencia entre [0-9], [[: digit:]] y \ d «.

También se puede establecer FS en el programa awk mismo. Esto generalmente se hace en un bloque BEGIN ya que «es una inicialización única:

awk "BEGIN { FS = "[0-9]" } { print $1 }" 

Tenga en cuenta que solo las comillas no se pueden usar en una cadena entre comillas simples en el shell, y que las awk cadenas siempre usan comillas dobles.

Comentarios

  • ¿Es posible acceder al FS y ver la cadena con la que coincide?

Responder

+1 para la respuesta de Kusalananda. Alternativamente, la variable FS se puede configurar en el bloque BEGIN:

awk "BEGIN {FS="[0-9]"} {print $1}" 

Cambiar FS en un bloque de acción no tendrá efecto hasta que se lea la siguiente línea

$ printf "%s\n" "abc123 def456" "ghi789 jkl0" | awk "{FS="[0-9]"; print $1}" abc123 ghi 

Los otros errores en la pregunta:

  • no se pueden utilizar comillas simples dentro de una cadena de comillas simples
  • == es un operador de comparación, = es para asignación de variables

Comentarios

  • " Changi ng FS en un bloque de acción no ' t entrará en vigor hasta que se lea la siguiente línea " I ' he estado buscando esa información por todas partes.
  • más: ¿puede ' t usar comillas simples para el valor de cadena en awk, incluso si las pasa de shell correctamente
  • ¿Es posible acceder al FS y ver la cadena que coincide?
  • FS es una variable, por lo que puede hacer algo como cualquier otra variable (por ejemplo, print FS). Para obtener las partes que coinciden con FS, con POSIX awk, creo que no puede. Con GNU awk podría escribir n = split($0, fields, FS, separators) donde fields y separators son matrices.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *