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}'sedsolo funciona si el número tiene exactamente 9 dígitos. Elprintfno funciona en zsh. Por lo tanto, la segundasedrespuesta 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'sprintfadmite prácticamente todo lo que puede hacer en laprintffunción Cprintfde coreutils hará lo mismofuente
zshpublicació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.utf8Puedes usar numfmt:
O:
Tenga en cuenta que numfmt no es una utilidad POSIX, es parte de los coreutils de GNU.
fuente
-d, --groupingya que las dobles guiones necesitan opciones largas?--gfunciona bien para mí en lugar de--grouping, es decir,numfmt --g 1234567890ynumfmt --grouping 1234567890hacer 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/AWKalternativa, por lo que es posible que no la haya usadoPERLantes. En cualquier caso, lo mejor es explicar lo que hace el comando, especialmente para las frases sencillas.Con algunas
awkimplementaciones:"%'"'"'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_sepfuente
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.awkybashtener 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, eltcomando 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] 13407807929942597099574024998205846127479365820592393377723561443721764030073546976801874298166903427690031858186486050853753882811946569946433649006084096Tenga en cuenta que necesito
treliminar 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,096fuente
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_sepconfiguració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
awkimplementaciones comomawkesa no son compatibles con los operadores de expresiones regulares de intervalo, cambie la expresión regular a/(^|[^.0123456789])[0123456789][0123456789][0123456789][0123456789]+/fuente