Comment utiliser regex comme séparateur de champ dans awk?


16

J'essaie d'utiliser regex comme séparateur de champ awk. D'après ma lecture, cela semble possible mais je n'arrive pas à obtenir la bonne syntaxe.

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

Pensées? Le but sinon obviouse est d'obtenir une liste de logiciels sans numéro de version.

Réponses:


25

Vous avez détruit vos citations et votre syntaxe. Pour définir le séparateur de champ de saisie, la façon la plus simple de le faire est avec l' -Foption sur la ligne de commande:

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

ou

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

Cela utiliserait n'importe quel chiffre comme séparateur de champ d'entrée, puis sortirait le premier champ de chaque ligne.

Les expressions [0-9]et [[:digit:]]ne sont pas tout à fait les mêmes, selon vos paramètres régionaux. Voir " Différence entre [0-9], [[: digit:]] et \ d ".

On pourrait également définir FSle awkprogramme lui-même. Cela se fait généralement dans un BEGINbloc car il s'agit d'une initialisation unique:

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

Notez que les guillemets simples ne peuvent pas être utilisés dans une chaîne entre guillemets simples dans le shell, et que les awkchaînes utilisent toujours des guillemets doubles.


12

+1 pour la réponse de Kusalananda. Alternativement, la variable FS peut être définie dans le bloc BEGIN:

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

La modification de FS dans un bloc d'action ne prendra effet qu'après la lecture de la ligne suivante

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

Les autres erreurs dans la question:

  • ne peut pas utiliser de guillemets simples dans une chaîne entre guillemets simples
  • ==est un opérateur de comparaison, =est pour l'affectation des variables

1
"Changer FS dans un bloc d'action ne prendra effet que lorsque la ligne suivante sera lue" J'ai cherché partout cette information.
Samizdis

1
plus: ne peut pas utiliser de guillemets simples pour la valeur de chaîne dans awk, même si vous les transmettez correctement depuis le shell
dave_thompson_085
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.