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

16

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 es obvio, es obtener una lista de software sin número de versión.

Carrera gris
fuente

Respuestas:

25

Has estropeado tus citas y sintaxis. Para configurar el separador de campo de entrada, la forma más fácil de hacerlo es con la -Fopción 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 exactamente iguales, dependiendo de su entorno local. Consulte " Diferencia entre [0-9], [[: dígito:]] y \ d ".

También se podría establecer FSen el awkpropio programa. Esto generalmente se hace en un BEGINbloque, ya que es una inicialización única:

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

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

Kusalananda
fuente
12

+1 por la respuesta de Kusalananda. Alternativamente, la variable FS se puede establecer 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 puede usar comillas simples dentro de una cadena entre comillas simples
  • ==es un operador de comparación, =es para asignación de variables
Glenn Jackman
fuente
1
"Cambiar FS en un bloque de acción no tendrá efecto hasta que se lea la siguiente línea" He estado buscando esa información por todas partes.
Samizdis
1
más: no puede usar comillas simples para el valor de cadena en awk, incluso si las pasa de shell correctamente
dave_thompson_085