파이썬에서
re.sub(r"(?<=.)(?=(?:...)+$)", ",", stroke )
트리플렛으로 숫자를 나누려면 다음과 같이하십시오.
echo 123456789 | python -c 'import sys;import re; print re.sub(r"(?<=.)(?=(?:...)+$)", ",", sys.stdin.read());'
123,456,789
bash / awk와 동일한 작업을 수행하는 방법은 무엇입니까?
답변
로 sed
:
$ echo "123456789" | sed 's/\([[:digit:]]\{3\}\)\([[:digit:]]\{3\}\)\([[:digit:]]\{3\}\)/\1,\2,\3/g'
123,456,789
(이것은 정확히 9 자리에서만 작동합니다!)
또는 이것으로 sed
:
$ echo "123456789" | sed ':a;s/\B[0-9]\{3\}\>/,&/;ta'
123,456,789
로 printf
:
$ LC_NUMERIC=en_US printf "%'.f\n" 123456789
123,456,789
답변
bash
의 printf
지원은 거의 모든 당신은에서 할 수있는 printf
C 기능
type printf # => printf is a shell builtin
printf "%'d" 123456 # => 123,456
printf
coreutils에서 동일한 작업을 수행합니다
/usr/bin/printf "%'d" 1234567 # => 1,234,567
답변
numfmt를 사용할 수 있습니다 :
$ numfmt --grouping 123456789
123,456,789
또는:
$ numfmt --g 123456789
123,456,789
numfmt는 POSIX 유틸리티가 아니며 GNU coreutils의 일부입니다.
답변
cat <<'EOF' |
13407807929942597099574024998205846127479365820592393377723561443721764030073546976801874298166903427690031858186486050853753882811946569946433649006084096
EOF
perl -wpe '1 while s/(\d+)(\d\d\d)/$1,$2/;'
생산 :
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
이것은 자릿수 문자열을 2 개의 그룹으로 나누고, 오른쪽 그룹은 3 자리, 왼쪽 그룹은 남아있는 것이지만 적어도 하나의 숫자로 나눕니다. 그런 다음 모든 것이 쉼표로 구분 된 두 그룹으로 대체됩니다. 대체가 실패 할 때까지 계속됩니다. “wpe”옵션은 오류 목록을위한 것이며, 자동 인쇄로 루프 안에 명령문을 묶고 perl “프로그램”으로 다음 인수를 사용하십시오 (자세한 내용은 perldoc perlrun 명령 참조).
최고의 소원 … 건배, drl
답변
일부 awk
구현 :
echo "123456789" | awk '{ printf("%'"'"'d\n",$1); }'
123,456,789
"%'"'"'d\n"
is : "%
(한 따옴표) (더블 따옴표) (한 따옴표) (더블 따옴표) (한 따옴표) d \ n"
로케일에 대해 구성된 천 단위 구분 기호를 사용합니다 (일반적 ,
으로 영어 로케일, 프랑스어 공간, .
스페인어 / 독일어 …). 에서 반환 한 것과 동일locale thousands_sep
답변
필자의 일반적인 사용 사례는 십진수가 천 단위 구분 기호로 인쇄되도록 명령 파이프 라인의 출력을 수정하는 것입니다. 오히려 함수 나 스크립트를 작성하는 것보다, 나는에 대한 즉시 사용자 정의 할 수있는 기술을 사용하는 것을 선호 어떤 유닉스 파이프 라인의 출력을.
나는 printf
(Awk에서 제공)이 이것을 달성하는 가장 유연하고 기억에 남는 방법이라는 것을 알았습니다 . 아포스트로피 / 작은 따옴표 문자는 POSIX에 의해 10 진수를 형식화하기 위한 수정 자로 지정되며 로케일을 인식하므로 쉼표 문자 사용으로 제한되지 않습니다.
Unix 쉘에서 Awk 명령을 실행할 때 작은 따옴표로 구분 된 문자열 내에 따옴표로 묶는 따옴표 문자를 입력하는 데 어려움이있을 수 있습니다 (예 : 위치 변수의 쉘 확장을 피하기 위해 $1
). 이 경우 작은 따옴표 문자를 입력하는 가장 읽기 쉽고 안정적인 방법은 8 진수 이스케이프 시퀀스로 시작하는 것입니다 (로 시작 함 \0
).
예:
printf "first 1000\nsecond 10000000\n" |
awk '{printf "%9s: %11\047d\n", $1, $2}'
first: 1,000
second: 10,000,000
가장 많은 디스크 공간을 사용하는 디렉토리를 보여주는 파이프 라인의 시뮬레이션 출력 :
printf "7654321 /home/export\n110384 /home/incoming\n" |
awk '{printf "%22s: %9\047d\n", $2, $1}'
/home/export: 7,654,321
/home/incoming: 110,384
다른 솔루션은 awk 내부에서 작은 따옴표를 이스케이프 처리하는 방법에 나열되어 있습니다.
참고 : 작은 따옴표 인쇄 에서 경고했듯이 16 진수 이스케이프 시퀀스는 다른 시스템에서 안정적으로 작동하지 않으므로 16 진수 이스케이프 시퀀스를 사용하지 않는 것이 좋습니다.
답변
awk
그리고 bash
내장 된 솔루션을 기반으로 좋은이 printf
다른 답변에 설명 된대로. 그러나 먼저 sed
.
를 위해서는 sed
“수동으로”해야합니다. 일반적인 규칙은 4 개의 연속 숫자가 있고 그 뒤에 숫자가 아닌 (또는 줄 끝) 있으면 첫 번째 숫자와 두 번째 숫자 사이에 쉼표를 삽입해야한다는 것입니다.
예를 들어
echo 12345678 | sed -re 's/([0-9])([0-9]{3})($|[^0-9])/\1,\2\3/'
인쇄합니다
12345,678
충분한 쉼표를 계속 추가하려면 프로세스를 계속 반복해야합니다.
sed -re ' :restart ; s/([0-9])([0-9]{3})($|[^0-9])/\1,\2\3/ ; t restart '
에서 sed
의 t
명령은 마지막 경우에 뛰어됩니다 레이블 지정 s///
명령이 성공적으로합니다. 따라서 :restart
뒤로 이동하기 위해 로 레이블을 정의합니다 .
다음은 여러 자릿수와 함께 작동 하는 bash 데모 ( ideone )입니다.
function thousands {
sed -re ' :restart ; s/([0-9])([0-9]{3})($|[^0-9])/\1,\2\3/ ; t restart '
}
echo 12 | thousands
echo 1234 | thousands
echo 123456 | thousands
echo 1234567 | thousands
echo 123456789 | thousands
echo 1234567890 | thousands