Como usar o regex como separador de campos no awk?

11

Estou tentando usar o regex como um separador de campo em awk . De minha leitura isso parece possível, mas não consigo acertar a sintaxe.

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

Pensamentos? O objetivo, se não obvio, é obter uma lista de softwares sem número de versão.

    
por Gray Race 07.10.2011 / 19:44

2 respostas

17

Você estragou suas citações. Aqui está uma maneira melhor:

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

ou

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

Isso usaria qualquer dígito como separador de campo de entrada e, em seguida, produziria o primeiro campo de cada linha.

As expressões [0-9] e [[:digit:]] não são bastante iguais, dependendo da sua localidade. Consulte " Diferença entre [0-9], [[: digit:]] e \ d ".

    
por 07.10.2011 / 20:04
12

+1 para a resposta do KAK. Como alternativa, a variável FS pode ser definida no bloco BEGIN:

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

A alteração do FS em um bloco de ação não será efetivada até que a próxima linha seja lida

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

Os outros erros na pergunta:

  • não pode usar aspas simples dentro de uma string entre aspas simples
  • == é um operador de comparação, = é para atribuição de variável
por 07.10.2011 / 20:20