숫자를 한 문자(숫자)와 동일한 값으로 대체

숫자를 한 문자(숫자)와 동일한 값으로 대체

모든 파일 형식 찾기를 사용하여 file -b $(find . -type f)고유한 카테고리로 분류한 다음 동일한 수의 "#"으로 대체된 숫자로 처음 4개 카테고리를 인쇄해야 합니다. 출력은 다음과 같아야 합니다.

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

각 카테고리의 파일 수를 "#" 표시로 인쇄하는 방법을 모르겠습니다.

각 줄의 숫자를 값으로 갖고 끝에 같은 수의 "#" 표시를 넣고 싶습니다.

답변1

"N 문자 시퀀스로 숫자 N을 표현하는 방법"이라는 주요 질문에 대답하기 위해 다음을 수행하는 쉘 명령이 있습니다.

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

(대체 구문: printf '%*s' "$n" '' | tr ' ' '#'; 다른 대안이 있으면 요점을 알 수 있습니다)

이것이 하는 일은 n공백( printf부분)으로 구성된 빈 줄을 생성한 다음 각 공백을 원하는 문자( tr부분)로 변환하는 것입니다.

count_files질문에 포함된 목록을 출력하는 명령이 있다고 가정하면 다음과 같이 명령을 사용할 수 있습니다.

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

...그리고 다음과 같은 결과를 얻게 됩니다:

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

답변2

Perl에서는 연산자를 사용하여 문자를 여러 번 반복할 수 있습니다 x.

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

그것을 사용하자.

대신에출력 구문 분석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)'

Perl 스크립트까지의 첫 번째 부분은 다음과 같은 출력을 생성합니다.

  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

Perl 스크립트는 후행 개행 문자를 제거한 chomp다음 숫자를 $1. 그런 다음 printf()숫자, 파일 유형 및 #숫자가 나타내는 문자 수를 인쇄합니다.

최종 출력은 다음과 유사합니다.

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   : #

관련 정보