Hvordan bruke regex som feltseparator i awk?

Jeg prøver å bruke regex som feltseparator i awk. Fra min lesing virker dette mulig, men Jeg kan ikke få syntaksen riktig.

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

Tanker? Målet hvis ikke obviouse er å få en liste over programvare uten versjonsnummer.

Svar

Du har slått sammen sitatene og syntaksen. For å angi inndatafelteskilleren, er den enkleste måten å gjøre det med alternativet -F på kommandolinjen:

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

eller

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

Dette vil bruke ethvert siffer som inndatafelteseparator, og deretter sende det første feltet fra hver linje.

[0-9] og [[:digit:]] uttrykkene er ikke helt de samme, avhengig av lokaliteten din. Se « Forskjell mellom [0-9], [[: digit:]] og \ d «.

Man kan også angi FS i selve awk -programmet. Dette gjøres vanligvis i en BEGIN -blokk, da den er en engangsinitialisering:

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

Legg merke til den anførselstegn kan ikke brukes i en enkelt sitert streng i skallet, og at awk strenger alltid bruker doble anførselstegn.

Kommentarer

  • Er det mulig å få tilgang til FS og se strengen den matchet?

Svar

+1 for Kusalanandas svar. Alternativt kan FS-variabelen settes i BEGIN-blokken:

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

Endring av FS i en aksjonsblokk vil ikke tre i kraft til neste linje leses

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

De andre feilene i spørsmålet:

  • kan ikke bruke enkle anførselstegn i en enkelt sitert streng
  • == er en sammenligningsoperator, = er for variabel tildeling

Kommentarer

  • " Changi ng FS i en handlingsblokk vant ' t trer i kraft til neste linje leses " I ' har lete overalt for den informasjonen.
  • pluss: kan ' t bruke enkelt anførselstegn for strengverdi i awk, selv om du sender dem fra shell riktig
  • Er det mulig å få tilgang til FS og se strengen den matchet?
  • FS er en variabel slik at du gjør noe som hvilken som helst annen variabel (f.eks. print FS). For å få delene som samsvarer med FS, med POSIX awk, tror jeg du ikke kan. Med GNU awk kan du skrive n = split($0, fields, FS, separators) der fields og separators er matriser.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *