GNU/Linux >> Tutoriales Linux >  >> Linux

¿Dividir caracteres individuales usando la cadena nula?

Leí esto en el manual de Gawk:

EXTENSIONES GNU

[…]

La capacidad de dividir caracteres individuales usando la cadena nula como el valor
de FS, y como el tercer argumento para dividir().

Sin embargo, este parece no ser el caso. Esto funciona como se esperaba:

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

y puedo deshabilitar otras extensiones:

$ export POSIXLY_CORRECT
$ gawk 'BEGIN {typeof(1)}'
gawk: cmd. line:1: fatal: function `typeof' not defined

pero no puedo deshabilitar el comportamiento dividido:

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

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

También miré el manual de Mawk:

Si FS =“”, entonces mawk divide el registro en caracteres individuales y,
de manera similar, split(s,A,””) coloca los caracteres individuales de s en A.

[…]

Posix deja explícitamente el comportamiento de FS ="" sin definir y menciona
dividir el registro en caracteres como una posible interpretación, pero
actualmente este uso no es transferible entre implementaciones.

Entonces, ¿con qué implementaciones no puedes obtener caracteres individuales con FS? y
split ?

Respuesta aceptada:

Eso no es POSIX en el sentido de que no puede usarlo en scripts POSIX porque POSIX deja el comportamiento sin especificar . Eso significa que mientras una aplicación (un script) no puede usarlo si quiere ser portátil, una implementación (un awk implementación) puede hacer lo que quiera si lo hace y aún así ser POSIX. POSIX no requiere awk para dividir en caracteres o bytes, o reportar un error, o reiniciar la computadora, lo deja sin especificar.

Así que gawk no tiene ninguna razón para cambiar su comportamiento en ese sentido cuando $POSIXLY_CORRECT está en el entorno¹, no hay un comportamiento que sea más correcto en POSIX que el otro en esa instancia.

Como averiguaste, esa extensión se encuentra en gawk (desde 3.0, enero de 1996) y mawk (desde la versión 1.2, enero de 1996). También está en la caja ocupada awk (desde el inicio (2002)), y desde mayo de 1996 también en el que mantiene Brian Kernighan (el k en awk ) (los FIXES archivo se refiere a gawk , etc. como inspiración). Parece que se agregó a los 3 en unos pocos meses, lo que sugiere que tal vez se discutió entre sus mantenedores. Ahora no estoy tan seguro de quién tuvo la idea primero.

Con awk de Brian Kernighan o los que se basan en él como en FreeBSD u OpenBSD, tenga en cuenta que mientras un FS vacío o un tercer argumento vacío pasado a split() hace que la cadena se divida en sus caracteres individuales (bueno, bytes , ver más abajo), awk -F '' devuelve un error (awk -v FS= aunque está bien).

Relacionado:¿Convertir genotipos a 0/1?

En Solaris, con ambos nawk y /usr/xpg4/bin/awk (y también el viejo /bin/awk de los años 70), un FS vacío parece deshabilitar la división por completo. nawk -F '' devuelve un error. Espero que sea lo mismo en otros Unices comerciales basados ​​en el código de AT&T como AIX o HP/UX, aunque no puedo probarlo allí.

También tenga en cuenta que mawk , awk de bwk (eso es diferente para algunos basados en él) y busybox awk no admiten caracteres multibyte. Entonces, por ejemplo, en UTF-8:

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

imprimiría la segunda mitad del tercer carácter en mi nombre. Entonces, con eso, es más correcto decir que un FS vacío se divide en bytes individuales, no en caracteres.

¹ Ahora me doy cuenta de que con POSIXLY_CORRECT, o --posix , gawk deshabilita algunas extensiones que de otro modo no entran en conflicto con POSIX (typeof hace gawk aunque no cumple), por lo que se podría decir que es una omisión. Ahora no sería el primero. Por ejemplo, no deshabilita nextfile a pesar de que entra en conflicto con POSIX (awk '{nextfile = 1}' está destinado a asignar 1 al nextfile variable pero informa un error en gawk incluso bajo POSIXLY_CORRECT).


Linux
  1. Solucionar problemas con el sistema de archivos proc en Linux

  2. ¿Un comando para imprimir solo los últimos 3 caracteres de una cadena?

  3. ¿Dividir la salida del comando por columnas usando Bash?

  4. Obtenga los últimos 4 caracteres de salida desde la salida estándar

  5. ¿Cómo averiguo qué está utilizando todo el espacio en mi partición /?

Usando el comando libre de Linux

Uso del archivo de configuración SSH

Tutorial sobre el uso del comando Timeout en Linux

Usando el comando tr en Linux para jugar con personajes

Linux:averigüe qué proceso está utilizando toda la RAM?

¿Cómo puedo verificar los caracteres textuales de una cadena de comando bash?