Divide os caracteres individuais usando a cadeia nula

3

Eu li isso no manual do Gawk:

GNU EXTENSIONS

[...]

The ability to split out individual characters using the null string as the value of FS, and as the third argument to split().

No entanto, este não parece ser o caso. Isso funciona como esperado:

$ gawk 'BEGIN {print split("quebec", z, "")}'
6

e posso desativar 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

Eu também procurei o manual do Mawk:

If FS = "", then mawk breaks the record into individual characters, and, similarly, split(s,A,"") places the individual characters of s into A.

[...]

Posix explicitly leaves the behavior of FS = "" undefined, and mentions splitting the record into characters as a possible interpretation, but currently this use is not portable across implementations.

Então, com quais implementações você não pode ter caracteres únicos com FS e split ?

    
por Steven Penny 14.01.2018 / 21:05

1 resposta

4

Isso não é POSIX porque você não pode usá-lo em scripts POSIX porque POSIX deixa o comportamento não especificado . Isso significa que, embora um aplicativo (um script) não possa usá-lo se quiser ser portátil, uma implementação (uma awk implementation) pode fazer o que quiser, se você fizer e ainda for POSIX. POSIX não requer awk para dividir em caracteres ou bytes, ou relatar um erro, ou reiniciar o computador, ele não é especificado.

Portanto, gawk não tem motivos para alterar seu comportamento a esse respeito quando $POSIXLY_CORRECT está no ambiente¹, não há comportamento que seja mais POSIXmente correto do que o outro nessa instância.

Como você descobriu, essa extensão é encontrada no gawk (desde 3.0, janeiro de 1996) e no mawk (desde a versão 1.2, janeiro de 1996). Também está em busybox awk (desde o início (2002)), e desde maio de 1996 também no mantido por Brian Kernighan (o k em awk ) (o arquivo FIXES se refere a gawk , etc. como inspiração). Parece que foi adicionado a todos os 3 dentro de alguns meses, sugerindo que talvez tenha sido discutido entre os seus mantenedores. Não tenho mais certeza agora de quem teve a ideia primeiro.

Com awk de Brian Kernighan ou os baseados nele como no FreeBSD ou OpenBSD, note que enquanto um FS vazio ou um terceiro argumento vazio passado para split() faz com que a string seja dividida em seus caracteres individuais ( bem, bytes , veja abaixo), awk -F '' retorna um erro ( awk -v FS= está OK embora).

No Solaris, com nawk e /usr/xpg4/bin/awk (e também o antigo /bin/awk dos anos 70), um FS vazio parece desabilitar totalmente a divisão. nawk -F '' retorna um erro. Eu esperaria que fosse o mesmo em outros Unices comerciais baseados em código AT & A, como AIX ou HP / UX, embora eu não possa testá-lo lá.

Observe também que mawk , awk do bwk (isso é diferente para alguns baseados nele) e o busybox awk não suportam caracteres multibyte. Então, por exemplo, em UTF-8:

echo Stéphane | awk -v FS= '{print $4}'

imprimiria a segunda metade do terceiro caractere em meu primeiro nome. Então, com esses, é mais correto dizer que um FS vazio se divide em bytes individuais, não em caracteres.

¹ Agora percebo que com POSIXLY_CORRECT, ou --posix , gawk desabilita algumas extensões que não entram em conflito com POSIX ( typeof torna gawk não-compatível), então você pode dizer que é uma omissão. Agora não seria o primeiro. Por exemplo, ele não desativa nextfile , mesmo que esteja em conflito com POSIX ( awk '{nextfile = 1}' tem como objetivo atribuir 1 à variável nextfile , mas relata um erro em gawk , mesmo em POSIXLY_CORRECT).

    
por 14.01.2018 / 23:00