파일 이름에 여러 줄이 포함된 파일이 있습니다.
"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é
\U00E9
e
두 번째 출력은 다음과 같습니다.
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 м
ɪ
및의 정렬 순서가 내 로케일에 정의되어 있지 않기 때문에 ʃ
및에 관한 한 동일하게 정렬되고 동일하게 계산됩니다.sort
uniq
(위의 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