Substituição do número com o mesmo valor (número) de um caractere

1

Eu tenho que encontrar todos os tipos de arquivos usando file -b $(find . -type f) , classificá-los em categorias exclusivas e imprimir no topo 4 a maioria das categorias onde o número é substituído pelo mesmo número de "#". A saída deve ser algo como isto:

 8 empty                      : ########
 6 ASCII text                 : ######
 3 Vim swap file, version 7.4 : ###
 1 UTF-8 Unicode text         : #

Não consigo descobrir como imprimir o número de arquivos em cada categoria como "#" marca.

Eu quero pegar o número em cada linha como um valor e colocar a mesma quantidade de "#" marcas no final.

    
por Buri 25.03.2017 / 12:51

2 respostas

0

Para responder à sua pergunta principal "como simbolizar um número N com uma sequência de N caracteres, aqui está um comando shell que fará exatamente isso:

n=17          # Number to translate to a sequence
printf "%${n}s" '' | tr ' ' '#'

(sintaxe alternativa: printf '%*s' "$n" '' | tr ' ' '#' ; existem outras alternativas, você entende)

O que ele faz é gerar uma linha em branco feita de n spaces (a parte printf ) e então converter cada espaço para o caractere desejado (a tr part).

Supondo que você tenha um comando count_files que produza a lista que você incluiu na sua pergunta, este comando pode ser usado assim:

count_files \
| while read n type; do 
    printf '%4d %-30s %s\n' "$n" "$type" "$(printf "%${n}s" '' | tr ' ' '#')"
done

... e você vai conseguir isso:

   8 empty                          ########
   6 ASCII text                     ######
   3 Vim swap file, version 7.4     ###
   1 UTF-8 Unicode text             #
    
por 25.03.2017 / 17:05
0

Em Perl, um caractere pode ser repetido várias vezes usando o operador x :

$ perl -e 'print "#" x 10, "\n"'
##########

Vamos usar isso.

Em vez de analisar a saída de find :

find . -type f -exec file -b {} + | sort | uniq -c | sort -rn |
perl -ne 'chomp; s/\s+(\d+)\s+// && printf("%-3d %-50s: %s\n", $1, $_, "#" x $1)'

A primeira parte, até o script Perl, produzirá resultados como

  23 ASCII C program text
  12 ASCII text
  10 ELF 64-bit LSB relocatable, x86-64, version 1
   3 ASCII English text
   1 ELF 64-bit LSB shared object, x86-64, version 1

O script Perl removerá a nova linha à direita com chomp e, em seguida, selecionará o número em $1 . Em seguida, ele usa printf() para imprimir o número, o tipo de arquivo e quantos caracteres # , conforme indicado pelo número.

O resultado final será algo como

23  ASCII C program text                              : #######################
12  ASCII text                                        : ############
10  ELF 64-bit LSB relocatable, x86-64, version 1     : ##########
3   ASCII English text                                : ###
1   ELF 64-bit LSB shared object, x86-64, version 1   : #
    
por 22.06.2018 / 15:25