パターンによるファイル名のグループ化と数の計算

パターンによるファイル名のグループ化と数の計算

特定の命名システムを使用するフォルダに多数のファイルがあります。次のように見えます。

my_file_A_a.txt
my_file_A_d.txt
my_file_A_f.txt
my_file_A_t.txt
my_file_B_r.txt
my_file_B_x.txt
my_file_C_f.txt
my_file_D_f.txt
my_file_D_g.txt
my_file_E_r.txt

次の結果を返すコマンドラインまたは一連のコマンド(一時ファイルが使用可能で書き込み権限がある)が必要です。

A: 4
B: 2
C: 1
D: 2
E: 1

多くのコマンドで実行できますが、ls -1 *A* | wc -l計算する「グループ」は何百ものあるため、時間がかかります。

また、各グループの名前は一意です。グループがあり、グループがAありますが、グループBはありませんAB

ベストアンサー1

ファイル名が「うまくいく」と仮定します。つまり、改行文字は含まれておらず、次の組み合わせがls機能awkします。

ls -d my_file* | awk -F'_' 'NF==4{count[$3]++} END{for (i in count) printf "%s: %d\n", i, count[i]}'

lsこれにより、起動したプログラムのすべてのファイルを一覧表示するコマンドの出力がリダイレクトされます。プログラムは、asフィールド区切り文字を使用し、グループ番号を「配列インデックス」として使用する3番目のフィールドをチェックして、配列内の項目を追跡します。my_file*awkawk_count

最後に、各グループがどれだけ頻繁に発生するかについての概要を印刷します。

気づく

  • 正確に4つのフィールドを必要とすることで、完全に間違ったファイル名に対する「最小」保護が提供されます。この仮定は、例の_ファイル名のa、、、、、d...部分に含めることはできません。f
  • 出力が必ずしもカテゴリ名でソートされるわけではありません。ソート順序は、ループawk内で配列インデックスを移動する方法によって異なりますfor (i in count)。ソートが必要な場合は、他のパイプを追加できますsort。または、GNU Awkを使用している場合は、次のように構成設定を追加できます。
    BEGIN{PROCINFO["sorted_in"]="@ind_str_asc"}
    
    ルールの前にNF==4{...}。これにより、配列インデックスに基づいて配列が検索され、辞書(ASCII)順にソートされます。
  • これは、最初に説明した制限に適用され、ファイル名の構造が非常に単純であるためです。一般的に言えばそうです。解析出力は推奨されません。ls

おすすめ記事