Eu li isso no manual do Gawk:
EXTENSÕES GNU
[...]
A capacidade de dividir caracteres individuais usando a string nula como o valor de FS e como o terceiro argumento para split().
No entanto, este parece não ser o caso. Isso funciona como esperado:
$ gawk 'BEGIN {print split("quebec", z, "")}'
6
e posso desabilitar outras extensões:
$ export POSIXLY_CORRECT
$ gawk 'BEGIN {typeof(1)}'
gawk: cmd. line:1: fatal: function `typeof' not defined
mas não consigo desativar o comportamento de divisão:
$ export POSIXLY_CORRECT
$ gawk 'BEGIN {print split("quebec", z, "")}'
6
$ gawk --posix 'BEGIN {print split("quebec", z, "")}'
6
Também procurei no manual do Mawk:
Se FS = "", então mawk divide o registro em caracteres individuais e, da mesma forma, split(s,A,"") coloca os caracteres individuais de s em A.
[...]
Posix deixa explicitamente o comportamento de FS = "" indefinido e menciona a divisão do registro em caracteres como uma possível interpretação, mas atualmente esse uso não é portátil entre as implementações.
Então, com quais implementações você não pode obter caracteres únicos com FS
e
split
?
Isso não é POSIX, pois você não pode usá-lo em scripts POSIX porque o POSIX deixa o comportamento não especificado . Isso significa que enquanto um aplicativo (um script) não pode usá-lo se quiser ser portátil, uma implementação (uma
awk
implementação) pode fazer o que quiser se você quiser e ainda ser POSIX. O POSIX não exigeawk
a divisão em caracteres ou bytes, nem relata um erro, nem reinicializa o computador, ele o deixa sem especificação.Então
gawk
não tem porque mudar seu comportamento nesse sentido quando$POSIXLY_CORRECT
está no ambiente¹, não existe um comportamento mais POSIXAMENTE correto do que o outro naquela instância.Como você descobriu, essa extensão é encontrada em gawk (desde 3.0, janeiro de 1996) e mawk (desde a versão 1.2, janeiro de 1996). Também está na busybox
awk
(desde o início (2002)), e desde maio de 1996 também na mantida por Brian Kernighan (ok
inawk
) (oFIXES
arquivo se refere agawk
, etc. como inspiração). Parece que foi adicionado a todos os 3 em alguns meses, sugerindo que talvez tenha sido discutido entre seus mantenedores. Não tenho tanta certeza de quem teve a ideia primeiro.Com o de Brian Kernighan
awk
ou aqueles baseados nele como no FreeBSD ou OpenBSD, observe que enquanto umFS
terceiro argumento vazio ou vazio passadosplit()
faz com que a string seja dividida em seus caracteres individuais (bem, bytes , veja abaixo),awk -F ''
retorna um erro (awk -v FS=
está bem embora).No Solaris, com ambos
nawk
e/usr/xpg4/bin/awk
(e também o antigo/bin/awk
dos anos 70), um vazioFS
parece desabilitar completamente a divisão.nawk -F ''
retorna um erro. Eu esperaria que fosse o mesmo em outros Unices comerciais baseados em código AT&T como AIX ou HP/UX, embora eu não possa testá-lo lá.Observe também que
mawk
, bwk'sawk
(que é diferente para alguns baseados nele) e awk busybox não suportam caracteres multibyte. Então, por exemplo, em UTF-8:imprimiria a segunda metade do terceiro caractere do meu primeiro nome. Portanto, é mais correto dizer que um FS vazio se divide em bytes individuais, não em caracteres.
¹ Percebo agora que com POSIXLY_CORRECT, ou
--posix
,gawk
desativa algumas extensões que de outra forma não entram em conflito com POSIX (typeof
tornagawk
-se incompatível), então você pode dizer que é uma omissão. Agora não seria o primeiro. Por exemplo, ele não desabilitanextfile
, embora entre em conflito com POSIX (awk '{nextfile = 1}'
destina-se a atribuir 1 ànextfile
variável, mas relata um errogawk
mesmo em POSIXLY_CORRECT).