В питоне
re.sub(r"(?<=.)(?=(?:...)+$)", ",", stroke )
Разделить число на тройки, например:
echo 123456789 | python -c 'import sys;import re; print re.sub(r"(?<=.)(?=(?:...)+$)", ",", sys.stdin.read());'
123,456,789
Как сделать то же самое с bash / awk?
bash
shell-script
awk
string
user2496
источник
источник
echo 123456789 | awk '$0=gensub(/(...)/,"\\1,","g")'
echo 123456789 | awk '$0=gensub(/(...)/,"\\1,","g"){sub(",$",""); print}'
sed
работает только если номер ровно 9 цифр.printf
Не работает на Zsh. Таким образом, второйsed
ответ, вероятно, лучший.echo 123456789 | awk '{printf ("%'\''d\n", $0)}'
(что, очевидно, не всегда работает в Linux!?, Но отлично работает в AIX и Solaris)bash
«Sprintf
поддерживает почти все , что можно сделать вprintf
функции Cprintf
из coreutils сделаю то же самоеисточник
zsh
обновленном посте здесь .vsnprintf
. В системе GNU / Linux, glibc поддерживает его, по крайней мере, с 1995 года.export LC_NUMERIC="en_US"
если вы хотите, чтобы запятые.locale -a
. Я должен был использоватьen_US.utf8
Вы можете использовать numfmt:
Или:
Обратите внимание, что numfmt - это не утилита POSIX, а часть GNU coreutils.
источник
-d, --grouping
так как двойные переносы требуют длинных опций?--g
у меня отлично работает вместо того--grouping
, т. е.numfmt --g 1234567890
иnumfmt --grouping 1234567890
делает то же самое. Это очень полезная маленькая утилита.производит:
Это достигается путем разделения строки цифр на 2 группы: правую группу с 3 цифрами, левую группу с тем, что осталось, но не менее одной цифры. Затем все заменяется на 2 группы, разделенные запятой. Это продолжается до тех пор, пока не произойдет замена. Параметры «wpe» предназначены для вывода списка ошибок, заключают оператор в цикл с автоматической печатью и принимают следующий аргумент в качестве «программы» perl (подробности см. В команде perldoc perlrun).
С наилучшими пожеланиями ... ура, дрл
источник
BASH
/AWK
альтернативу, поэтому он, возможно, не использовалPERL
раньше. В любом случае, лучше всего объяснить, что делает команда, особенно для однострочников.С некоторыми
awk
реализациями:"%'"'"'d\n"
is:"%
(одинарные кавычки) (двойные кавычки) (одинарные кавычки) (двойные кавычки) (одинарные кавычки) d \ n"
Это будет использовать сконфигурированный разделитель тысяч для вашей локали (обычно
,
в английских локалях, пробел во французском,.
испанском / немецком ...). То же, что возвращеноlocale thousands_sep
источник
Обычный вариант использования для меня - изменить вывод командного конвейера так, чтобы десятичные числа печатались с тысячами разделителей. Вместо того, чтобы писать функцию или скрипт, я предпочитаю использовать технику, которую я могу настроить на лету для любого вывода из конвейера Unix.
Я нашел
printf
(предоставленный Awk) самый гибкий и запоминающийся способ для достижения этой цели. Символ апостроф / одинарная кавычка указывается POSIX как модификатор для форматирования десятичных чисел и имеет то преимущество, что он учитывает локаль, поэтому он не ограничен использованием символов запятой.При запуске команд Awk из оболочки Unix могут возникнуть трудности при вводе символа одинарных кавычек внутри строки, разделенной одинарными кавычками (чтобы избежать расширения оболочки позиционных переменных, например,
$1
). В этом случае я считаю, что наиболее читаемый и надежный способ ввести символ одинарных кавычек - это ввести его в виде восьмеричной escape-последовательности (начиная с\0
).Пример:
Имитированный вывод конвейера, показывающий, какие каталоги используют больше всего дискового пространства:
Другие решения перечислены в разделе Как избежать одиночной кавычки внутри awk .
Примечание. Как указано в разделе « Печать одинарных кавычек» , рекомендуется избегать использования шестнадцатеричных escape-последовательностей, поскольку они не работают надежно в разных системах.
источник
\047
.awk
иbash
иметь хорошие встроенные решения, основанные на томprintf
, как описано в других ответах. Но сначалаsed
.Для
sed
этого нам нужно сделать это «вручную». Общее правило состоит в том, что если у вас есть четыре последовательные цифры, за которыми следует не цифра (или конец строки), то между первой и второй цифрой должна быть вставлена запятая.Например,
распечатает
Очевидно, что нам нужно повторять этот процесс, чтобы добавить достаточно запятых.
В
sed
, тоt
команда определяет метку , которая будет прыгнули в случае , если последняяs///
команда была успешно выполнена . Поэтому я определяю метку:restart
для того, чтобы она отскочила назад.Вот демоверсия bash (на ideone ), которая работает с любым количеством цифр:
источник
источник
Если вы смотрите на БОЛЬШИЕ номера, я не смог заставить вышеуказанные решения работать. Например, давайте получим действительно большое число:
$ echo 2^512 |bc -l|tr -d -c [0-9] 13407807929942597099574024998205846127479365820592393377723561443721764030073546976801874298166903427690031858186486050853753882811946569946433649006084096
Примечание. Мне нужно
tr
удалить вывод строки с обратной косой черты из bc. Это число слишком велико, чтобы его можно было рассматривать как число с плавающей запятой или фиксированное число битов в awk, и я даже не хочу создавать регулярное выражение, достаточно большое, чтобы учесть все цифры в sed. Скорее, я могу повернуть его вспять и поставить запятые между группами из трех цифр, а затем развернуть это: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
источник
awk: run time error: improper conversion(number 1) in printf("%'d
.источник
sed 's/^,//g'
.Я также хотел бы иметь часть после в десятичном разделителе правильно отделенном / разнесенном, поэтому я написал эту SED-скрипт , который использует некоторые переменные оболочки для настройки региональных и личных предпочтений. Он также учитывает различные соглашения для количества цифр, сгруппированных вместе :
источник
A
bash
/awk
(по запросу) решение, которое работает независимо от длины числа и использует,
независимо отthousands_sep
настроек локали и везде, где числа находятся на входе, и избегает добавления разделителя тысяч после1.12345
:дает:
В
awk
таких реализациях,mawk
которые не поддерживают интервальные операторы регулярных выражений, измените регулярное выражение на/(^|[^.0123456789])[0123456789][0123456789][0123456789][0123456789]+/
источник