Come utilizzare regex come separatore di campo in awk?

Sto cercando di utilizzare regex come separatore di campo in awk. Dalla mia lettura sembra possibile ma Non riesco a ottenere la sintassi corretta.

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

Pensieri? Lobiettivo, se non ovvio, è ottenere un elenco di software senza numero di versione.

Risposta

Hai sbagliato le virgolette e la sintassi. Per impostare il separatore del campo di input, il modo più semplice per farlo è con lopzione -F nella riga di comando:

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

o

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

Questo userebbe qualsiasi cifra come separatore del campo di input, quindi produrrebbe il primo campo di ogni riga.

Le espressioni [0-9] e [[:digit:]] non sono esattamente le stesse, a seconda della tua lingua. Vedi “ Differenza tra [0-9], [[: digit:]] e \ d “.

Si potrebbe anche impostare FS nel programma awk stesso. Questo di solito viene fatto in un BEGIN blocco in quanto è “uninizializzazione una tantum:

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

Nota che singolo le virgolette non possono “essere usate in una stringa tra virgolette singole nella shell e quelle awk stringhe sempre usano virgolette doppie.

Commenti

  • È possibile accedere a FS e vedere la stringa corrispondente?

Risposta

+1 per la risposta di Kusalananda. In alternativa, la variabile FS può essere impostata nel blocco BEGIN:

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

La modifica di FS in un blocco di azioni non avrà effetto finché non viene letta la riga successiva

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

Gli altri errori nella domanda:

  • non posso “utilizzare virgolette singole allinterno di una stringa tra virgolette singole
  • == è un operatore di confronto, = è per lassegnazione di variabili

Commenti

  • " Changi ng FS in un blocco di azioni non ' ha effetto finché non viene letta la riga successiva " I ' ho cercato queste informazioni dappertutto.
  • plus: ' t utilizzare virgolette singole per il valore della stringa in awk, anche se le passi da shell correttamente
  • È possibile accedere a FS e vedere la stringa a cui corrisponde?
  • FS è una variabile quindi fai qualcosa di simile qualsiasi altra variabile (ad es. print FS). Per ottenere le parti che corrispondono a FS, con POSIX awk, penso che non sia possibile. Con GNU awk potresti scrivere n = split($0, fields, FS, separators) dove fields e separators sono array.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *