printf, awk… Como formatar um número com espaço para os milhares

5

Existe uma maneira simples de separar um número muito grande por mil com printf, awk, sed?

Portanto, 10000000000000 é 10 000 000 000 000

Obrigado

    
por rcspam 10.01.2018 / 10:06

6 respostas

2

Uma combinação simples de sed e rev poderia ser empregada -

echo  "I have 10000013984 oranges" | rev | sed "s/[0-9][0-9][0-9]/& /g" | rev 

A primeira rev é necessária para substituir o número da direita para a esquerda e a segunda para recuperar a string original.

    
por 10.01.2018 / 12:28
11

Com algumas implementações printf (incluindo% GNUprintf e printf incorporado em ksh93 , zsh , bash e lksh (mas não dash nem yash ) no GNU sistemas) e supondo que seu sistema tem um francês (pelo menos da França ou Canadá), ou sueco ou esloveno ou macedônio ou localidade do Quirguistão (e mais alguns, isto é, aqueles que têm espaço como o separador de milhar):

$ LC_ALL=fr_FR locale -k thousands_sep
thousands_sep=" "
$ LC_ALL=fr_FR printf "%'d\n" 10000000000
10 000 000 000

Também funciona com algumas implementações de awk :

$ LC_ALL=fr_FR awk 'BEGIN{printf "%'\''d\n", 1e10}'
10 000 000 000

Você pode usar LC_NUMERIC em vez de LC_ALL se souber que LC_ALL não está definido.

    
por 10.01.2018 / 10:25
4

Você precisa fazer um loop com sed :

echo "9765625000 * 1024 = 10000000000000" | sed -e :a -e 's/\(.*[0-9]\)\([0-9]\{3\}\)/ /;ta'
9 765 625 000 * 1 024 = 10 000 000 000 000

(Obrigado pela melhoria, Stéphane!)

Ou melhor legível, mas talvez não compatível com as versões sed mais antigas, com expressões regulares estendidas:

echo "9765625000 * 1024 = 10000000000000" | sed -E -e :a -e 's/(.*[0-9])([0-9]{3})/ /;ta'
9 765 625 000 * 1 024 = 10 000 000 000 000
    
por 10.01.2018 / 10:25
1

Se você estiver satisfeito com o separador de milhares definido pela localidade atual, poderá usar o perl Number :: Format módulo como este:

$ perl -e 'use Number::Format qw(format_number);
           print format_number(shift),"\n"' 10000000000000
10,000,000,000,000

(linefeeds extras adicionados para legibilidade. isso pode ser inserido em uma linha)

Se você quiser espaços separando os milhares, independentemente da localidade:

perl -e 'use Number::Format;
         my $num= new Number::Format(-thousands_sep=>" ");
         print $num->format_number(shift), "\n"' 10000000000000
10 000 000 000 000
    
por 11.01.2018 / 10:36
0

com LANG=nl_BE

awk 'BEGIN {
  I=0
  T=1
  while ( I < 10 ) {
    S = sprintf("%'\''d",T)
    gsub(/\./," ",S)
    print S
    T *= 10
    I++
  }
}'

1
10
100
1 000
10 000
100 000
1 000 000
10 000 000
100 000 000
1 000 000 000
    
por 10.01.2018 / 10:27
0

Obrigado a todos,

Eu encontrei uma solução que combina comigo com sed. Trabalha com números inteiros e flutuantes (com menos de 3 casas decimais).

echo 12120013984.235 |  sed ':a;s/\B[0-9]\{3\}\>/ &/;ta'

Encontrei-o aqui: link com as explicações:

\ B   Corresponde a qualquer coisa que não seja um limite de palavras.

[0-9]   Corresponde a qualquer dígito.

\ {3 \}   Corresponde a três repetições do que precede (neste caso, um dígito).

\ >   Corresponde a um limite de palavra no final de uma palavra.

    
por 11.01.2018 / 12:59