Ho letto questo nel manuale di Gawk:
ESTENSIONI GNU
[…]
La possibilità di suddividere i singoli caratteri utilizzando la stringa nulla come valore
di FS e come terzo argomento per dividere().
Tuttavia questo sembra non essere il caso. Funziona come previsto:
$ gawk 'BEGIN {print split("quebec", z, "")}'
6
e posso disabilitare altre estensioni:
$ export POSIXLY_CORRECT
$ gawk 'BEGIN {typeof(1)}'
gawk: cmd. line:1: fatal: function `typeof' not defined
ma non riesco a disabilitare il comportamento di divisione:
$ export POSIXLY_CORRECT
$ gawk 'BEGIN {print split("quebec", z, "")}'
6
$ gawk --posix 'BEGIN {print split("quebec", z, "")}'
6
Ho anche guardato il manuale di Mawk:
Se FS =“”, allora mawk suddivide il record in singoli caratteri e,
allo stesso modo, split(s,A,””) inserisce i singoli caratteri di s in A.
[…]
Posix lascia esplicitamente indefinito il comportamento di FS =“” e menziona
la suddivisione del record in caratteri come possibile interpretazione, ma
attualmente questo uso non è trasferibile tra le implementazioni.
Quindi, con quali implementazioni non puoi ottenere singoli caratteri con FS
esplit
?
Risposta accettata:
Non è POSIX in quanto non puoi usarlo negli script POSIX perché POSIX lascia il comportamento non specificato . Ciò significa che mentre un'applicazione (uno script) non può utilizzarlo se vuole essere portatile, un'implementazione (un awk
implementazione) può fare tutto ciò che vuole se lo fai ed essere ancora POSIX. POSIX non richiede awk
per dividere in caratteri o byte, o segnalare un errore, o riavviare il computer, non viene specificato.
Quindi gawk
non ha motivo di cambiare il suo comportamento a tale riguardo quando $POSIXLY_CORRECT
è nell'ambiente¹, non esiste un comportamento più POSIXly corretto dell'altro in quel caso.
Come hai scoperto, quell'estensione si trova in gawk (dalla versione 3.0, gennaio 1996) e mawk (dalla versione 1.2, gennaio 1996). È anche in busybox awk
(dall'inizio (2002)), e dal maggio 1996 anche in quello curato da Brian Kernighan (il k
in awk
) (il FIXES
il file fa riferimento a gawk
, ecc. come ispirazione). Sembra che sia stato aggiunto a tutti e 3 in pochi mesi suggerendo che forse è stato discusso tra i loro manutentori. Non sono così sicuro ora chi ha avuto l'idea per primo.
Con awk
di Brian Kernighan o quelli basati su di esso come su FreeBSD o OpenBSD, nota che mentre un FS
vuoto o un terzo argomento vuoto passato a split()
fa sì che la stringa venga suddivisa nei suoi singoli caratteri (beh, byte , vedi sotto), awk -F ''
restituisce un errore (awk -v FS=
va bene comunque).
Su Solaris, con entrambi nawk
e /usr/xpg4/bin/awk
(e anche il vecchio /bin/awk
degli anni '70), un FS
vuoto sembra disabilitare del tutto la divisione. nawk -F ''
restituisce un errore. Mi aspetto che sarebbe lo stesso su altri Unice commerciali basati su codice AT&T come AIX o HP/UX, anche se non posso testarlo lì.
Nota anche che mawk
, awk
di bwk (è diverso per alcuni basati su di esso) e busybox awk non supportano i caratteri multibyte. Ad esempio, in UTF-8:
echo Stéphane | awk -v FS= '{print $4}'
stamperebbe la seconda metà del terzo carattere nel mio nome. Quindi, con quelli, è più corretto dire che un FS vuoto si divide in singoli byte, non in caratteri.
¹ Adesso mi rendo conto che con POSIXLY_CORRECT, o --posix
, gawk
disabilita alcune estensioni che altrimenti non sono in conflitto con POSIX (typeof
fa gawk
non conforme), quindi potresti dire che è un'omissione. Ora non sarebbe il primo. Ad esempio, non disabilita nextfile
anche se è in conflitto con POSIX (awk '{nextfile = 1}'
ha lo scopo di assegnare 1 al nextfile
variabile ma segnala un errore in gawk
anche sotto POSIXLY_CORRECT).