숫자에 천 단위 구분 기호 추가 파이썬에서 re.sub(r”(?<=.)(?=(?:…)+$)”,

파이썬에서

 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


답변

bashprintf지원은 거의 모든 당신은에서 할 수있는 printfC 기능

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 '

에서 sedt명령은 마지막 경우에 뛰어됩니다 레이블 지정 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