En pitón
re.sub(r"(?<=.)(?=(?:...)+$)", ",", stroke )
Para dividir un número por trillizos, por ejemplo:
echo 123456789 | python -c 'import sys;import re; print re.sub(r"(?<=.)(?=(?:...)+$)", ",", sys.stdin.read());'
123,456,789
¿Cómo hacer lo mismo con bash / awk?
bash
shell-script
awk
string
usuario2496
fuente
fuente
echo 123456789 | awk '$0=gensub(/(...)/,"\\1,","g")'
echo 123456789 | awk '$0=gensub(/(...)/,"\\1,","g"){sub(",$",""); print}'
sed
solo funciona si el número tiene exactamente 9 dígitos. Elprintf
no funciona en zsh. Por lo tanto, la segundased
respuesta es probablemente la mejor.echo 123456789 | awk '{printf ("%'\''d\n", $0)}'
(¡que evidentemente no siempre funciona en Linux! ?, pero funciona bien en AIX y Solaris)bash
'sprintf
admite prácticamente todo lo que puede hacer en laprintf
función Cprintf
de coreutils hará lo mismofuente
zsh
publicación actualizada aquí .vsnprintf
. En un sistema GNU / Linux, glibc parece haberlo soportado desde al menos 1995.export LC_NUMERIC="en_US"
hacerlo si quieres forzar comas.locale -a
. Tuve que usaren_US.utf8
Puedes usar numfmt:
O:
Tenga en cuenta que numfmt no es una utilidad POSIX, es parte de los coreutils de GNU.
fuente
-d, --grouping
ya que las dobles guiones necesitan opciones largas?--g
funciona bien para mí en lugar de--grouping
, es decir,numfmt --g 1234567890
ynumfmt --grouping 1234567890
hacer lo mismo. Es una pequeña utilidad muy útil.produce:
Esto se logra dividiendo la cadena de dígitos en 2 grupos, el grupo de la derecha con 3 dígitos, el grupo de la izquierda con lo que queda, pero al menos un dígito. Luego, todo se reemplaza por los 2 grupos, separados por una coma. Esto continúa hasta que la sustitución falla. Las opciones "wpe" son para la lista de errores, encierran la declaración dentro de un bucle con una impresión automática y toman el siguiente argumento como el "programa" perl (vea el comando perldoc perlrun para más detalles).
Mis mejores deseos ... salud, drl
fuente
BASH
/AWK
alternativa, por lo que es posible que no la haya usadoPERL
antes. En cualquier caso, lo mejor es explicar lo que hace el comando, especialmente para las frases sencillas.Con algunas
awk
implementaciones:"%'"'"'d\n"
es:"%
(comilla simple) (comilla doble) (comilla simple) (comilla doble) (comilla simple) d \ n"
Eso usará el separador de miles configurado para su configuración regional (generalmente
,
en configuraciones regionales en inglés, espacio en francés,.
en español / alemán ...). Lo mismo que devuelto porlocale thousands_sep
fuente
Un caso de uso común para mí es modificar la salida de una tubería de comando para que los números decimales se impriman con miles de separadores. En lugar de escribir una función o script, prefiero usar una técnica que pueda personalizar sobre la marcha para cualquier salida de una tubería de Unix.
He encontrado
printf
(proporcionado por Awk) la forma más flexible y memorable de lograr esto. POSIX especifica el carácter de apóstrofe / comilla simple como un modificador para formatear números decimales y tiene la ventaja de que es compatible con la configuración regional, por lo que no se limita al uso de caracteres de coma.Al ejecutar comandos Awk desde un shell de Unix, puede haber dificultades para ingresar un carácter de comillas simples dentro de una cadena delimitada por comillas simples (para evitar la expansión del shell de variables posicionales, por ejemplo
$1
). En este caso, encuentro que la forma más legible y confiable de ingresar el carácter de comillas simples es ingresarlo como una secuencia de escape octal (comenzando por\0
).Ejemplo:
Salida simulada de una tubería que muestra qué directorios están utilizando la mayor cantidad de espacio en disco:
Otras soluciones se enumeran en Cómo escapar de una cita simple dentro de awk .
Nota: como se advirtió en Print a Single Quote , se recomienda evitar el uso de secuencias de escape hexadecimales, ya que no funcionan de manera confiable en diferentes sistemas.
fuente
\047
.awk
ybash
tener buenas soluciones integradas, basadas enprintf
, como se describe en las otras respuestas. Pero primero,sed
.Para
sed
, tenemos que hacerlo "manualmente". La regla general es que si tiene cuatro dígitos consecutivos, seguidos de un no dígito (o final de línea), se debe insertar una coma entre el primer y el segundo dígito.Por ejemplo,
imprimirá
Obviamente, debemos seguir repitiendo el proceso para seguir agregando suficientes comas.
En
sed
, elt
comando especifica una etiqueta a la que se saltará si el últimos///
comando fue exitoso. Por lo tanto, defino una etiqueta con:restart
, para que salte hacia atrás.Aquí hay una demostración de bash (en ideone ) que funciona con cualquier número de dígitos:
fuente
fuente
Si está buscando números GRANDES, no pude hacer que las soluciones anteriores funcionen. Por ejemplo, obtengamos un número realmente grande:
$ echo 2^512 |bc -l|tr -d -c [0-9] 13407807929942597099574024998205846127479365820592393377723561443721764030073546976801874298166903427690031858186486050853753882811946569946433649006084096
Tenga en cuenta que necesito
tr
eliminar el resultado de nueva línea de barra diagonal inversa de bc. Este número es demasiado grande para tratarlo como flotante o número de bit fijo en awk, y ni siquiera quiero construir una expresión regular lo suficientemente grande como para dar cuenta de todos los dígitos en sed. Más bien, puedo revertirlo y poner comas entre grupos de tres dígitos, luego revertirlo:echo 2^512 |bc -l|tr -d -c [0-9] |rev |sed -e 's/\([0-9][0-9][0-9]\)/\1,/g' |rev 13,407,807,929,942,597,099,574,024,998,205,846,127,479,365,820,592,393,377,723,561,443,721,764,030,073,546,976,801,874,298,166,903,427,690,031,858,186,486,050,853,753,882,811,946,569,946,433,649,006,084,096
fuente
awk: run time error: improper conversion(number 1) in printf("%'d
.fuente
sed 's/^,//g'
.También quería tener la parte después del separador decimal correctamente separado / espaciado, por lo tanto, escribí este script sed que usa algunas variables de shell para ajustar las preferencias regionales y personales. También tiene en cuenta diferentes convenciones para el número de dígitos agrupados :
fuente
Una solución A
bash
/awk
(según lo solicitado) que funciona independientemente de la longitud del número y se utiliza,
independientemente de la configuración de lathousands_sep
configuración regional , y dondequiera que estén los números en la entrada y evita agregar el separador de miles después en1.12345
:Da:
Con
awk
implementaciones comomawk
esa no son compatibles con los operadores de expresiones regulares de intervalo, cambie la expresión regular a/(^|[^.0123456789])[0123456789][0123456789][0123456789][0123456789]+/
fuente