Cuente cuántas líneas comienzan con qué caracteres

Tengo un file con varias líneas en un nombre de file.

Quiero contar cuántas líneas comienzan con el carácter 'a', con 'b' y así sucesivamente de una vez.

¿Qué command debería ejecutar?

Prueba esto:

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

O, si lo desea, no distingue entre mayúsculas y minúsculas, esto:

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

Para letras de caracteres individuales:

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

Para manejar caracteres de combinación, si está en una configuration regional de 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"}}' 

(reemplace $n{$&} con $n{lc$&} para conteo independiente de mayúsculas y minúsculas).

En una input como:

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

En mi localidad, el primero generaría:

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

Porque en éléphant anterior (que por cierto mi versión de firefox muestra incorrectamente como pone el acento en el l ), el primer é se escribe como los dos caracteres unicode e y \U0301 (combinando acento agudo), mientras que en été , es el \U00E9 precompuesto e con acento agudo.

Y el segundo daría como resultado:

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

(allí, todas las variantes de é se han convertido a e\U0301 (la versión descompuesta normalizada)).

Mientras cut -c 1 | grep '[[:alpha:]]' | sort | uniq -c cut -c 1 | grep '[[:alpha:]]' | sort | uniq -c cut -c 1 | grep '[[:alpha:]]' | sort | uniq -c daría salida:

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

porque en mi configuration regional, el order de sorting de ɪ y ʃ no está definido, por lo que orderan lo mismo y countn como iguales en cuanto a sort y uniq .

(Tenga en count que necesita un cut POSIX anterior. Mi versión de cut GNU no es como trata los caracteres como bytes, así que tuve que usar el cut incorporado en ksh93 para eso).

Si los datos son solo US-ASCII, puede simplificarlo a:

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

O si desea reportar 0 para cualquiera de las 52 cartas ASCII de EE. UU. Que no se encuentran:

 < 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}}'