어떤 문자로 시작하는 줄 수를 세어보세요.

어떤 문자로 시작하는 줄 수를 세어보세요.

파일 이름에 여러 줄이 포함된 파일이 있습니다.

"a", "b" 등의 문자로 시작하는 줄 수를 한 번에 세고 싶습니다.

어떤 명령을 실행해야 합니까?

답변1

단일 문자의 경우:

< file cut -c1 | grep '[[:alpha:]]' | LC_ALL=C sort | LC_ALL=C uniq -c | sort -k 2

결합 문자를 처리하려면(utf-8 로케일인 경우):

< file PERLIO=:utf8 perl -Mlocale -MUnicode::Normalize -lne '
  $_=NFKD($_); $n{$&}++ if /^[[:alpha:]]/u && /^\X/u;
  END{for $i (sort keys %n) {print "$n{$i} $i"}}'

( 대소문자 독립적인 개수 $n{$&}로 대체됨 $n{lc$&})

다음과 같이 입력하면:

fix
été
-dash-
éléphant
παράλληλα
молчит
alphabet
3com
foo
ɪ-letter
ʃ-letter

내 로케일에서는 첫 번째 항목이 출력됩니다.

  1 ɪ
  1 ʃ
  1 a
  1 e
  1 é
  2 f
  1 π
  1 м

왜냐하면코끼리위(그런데 내 Firefox 버전은 에 악센트를 넣기 때문에 잘못 표시됨 l), 첫 번째 문자 는 두 개의 유니코드 문자 및 (급 악센트 결합) é로 작성되고 급성 악센트 Pre-mixed 로 작성됩니다 .e\U0301été\U00E9e

두 번째 출력은 다음과 같습니다.

1 ɪ
1 ʃ
1 a
2 é
2 f
1 π
1 м

(여기서 모든 변형은 (정규화된 분해 버전) é으로 변환되었습니다 e\U0301.)

대신 다음과 같이 cut -c 1 | grep '[[:alpha:]]' | sort | uniq -c출력됩니다.

  2 ɪ
  1 a
  1 e
  1 é
  2 f
  1 π
  1 м

ɪ및의 정렬 순서가 내 로케일에 정의되어 있지 않기 때문에 ʃ및에 관한 한 동일하게 정렬되고 동일하게 계산됩니다.sortuniq

(위의 POSIX가 필요하다는 점에 유의하십시오 cut. 내 GNU 버전은 cut문자를 바이트로 처리하지 않으므로 내장된 를 사용해야 했습니다 . cut)ksh93

데이터가 US-ASCII 전용인 경우 다음과 같이 단순화할 수 있습니다.

(export LC_ALL=C; < file cut -c 1 | grep '[[:alpha:]]' | sort | uniq -c)

0또는 찾을 수 없는 52개의 US ASCII 문자를 보고하려는 경우 :

< file LC_ALL=C awk '{n[substr($0,1,1)]++};END{
  for(i=65;i<=122;i++) if (i < 91 || i > 96) {
    c=sprintf("%c",i);print 0+n[c], c}}'

답변2

이 시도:

<file.txt sed 's/^\(.\).*/\1/' | sort | uniq -c

또는 대소 문자를 구분하지 않으려면 다음을 수행하십시오.

<file.txt sed 's/^\(.\).*/\1/' | tr a-z A-Z | sort | uniq -c

관련 정보