任意の文字で始まる行数を数えます。

任意の文字で始まる行数を数えます。

ファイル名に複数の行を含むファイルがあります。

「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)、最初の文字は2つのUnicode文字と(Accentの組み合わせ)éで書かれ、急性アクセントのプレミックスで書かれています。e\U0301été\U00E9e

2番目の出力は次のとおりです。

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文字をバイトとして扱わないので、組み込みを使用する必要がありました。cutksh93

データが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

関連情報