ファイル名に複数の行を含むファイルがあります。
「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é
\U00E9
e
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 м
ɪ
との並べ替え順序は私のロケールで定義されていないので、およびについては同じように並べ替えられ、ʃ
同じように計算されます。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