Como usar regex como separador de campo no awk?

Estou tentando usar regex como separador de campo em awk. Pela minha leitura, isso parece possível, mas Não consigo entender a sintaxe certa.

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 óbvio, é obter uma lista de softwares sem número de versão.

Resposta

Você bagunçou suas citações e sintaxe. Para definir o separador de campo de entrada, a maneira mais fácil de fazer isso é com a opção -F na linha de comando:

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, geraria o primeiro campo de cada linha.

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

Também é possível definir FS no próprio programa awk. Isso geralmente é feito em um bloco BEGIN, pois é uma inicialização única:

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

Observe que único as aspas não podem ser usadas em uma string entre aspas simples no shell e que awk strings sempre usam aspas duplas.

Comentários

  • É possível acessar o FS e ver a string correspondente?

Resposta

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

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

Alterar FS em um bloco de ação não terá efeito 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

Comentários

  • " Changi ng FS em um bloco de ação ' não terá efeito até que a próxima linha seja lida " I ' tenho procurado por todas essas informações.
  • mais: não pode ' usar aspas simples para valores de string em awk, mesmo que você os passe de shell corretamente
  • É possível acessar o FS e ver a string correspondente?
  • FS é uma variável, então você faz algo como qualquer outra variável (por exemplo, print FS). Para obter as partes que combinam com FS, com POSIX awk, acho que não dá. Com GNU awk, você pode escrever n = split($0, fields, FS, separators) onde fields e separators são arrays.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *