複数のファイルに対してgrepとwc -lを繰り返し実行する

複数のファイルに対してgrepとwc -lを繰り返し実行する

fastaファイルが複数あり、">"(引用符を除く)で始まる行数を計算したいと思います。

私がいつもすることは

grep ">" file.fasta | wc -l

この時間は1つのファイルに適用されます。私は以下を使用して他の選択肢を試しています。探すコマンドを実行しましたが、何も機能しないようです。私が最後にしたいのは、1行ずつ、ファイル名を指定して>で始まる行数を数えることです。理想的には1行でなければなりません。

答え1

grepフラグを使用して計算できるため、-c必要wc -lありません。また、grep複数のファイルを提供する場合は、そのファイルが入力として使用されます。

例えば、

grep -c '^>' some/dir/*.fa

このタスクを再帰的に実行するには、そのオプションを知っているオプションがあるgrep -Rc '^>' dirname場合に使用します(これは実行されます)。grep-Rみんなファイル)、そうでない場合は以下を使用してくださいfind

find dirname -type f \( -name '*.fa' -o -name '*.fasta' \) -exec grep -c '^>' /dev/null {} +

/dev/null上記のコマンドの追加項目は、grep少なくとも2つの入力ファイルをインポートし、結果として処理するファイルの名前を常に表示することを保証します(単一の入力ファイルに対してはこれを行いません)。非標準オプションですが、-H一緒に使用することもできます。grep

または、パス名が次のようなループに元のコマンドを挿入しますfind

find dirname -type f \( -name '*.fa' -o -name '*.fasta' \) -exec sh -c '
    for pathname do
        printf "Counting in %s...\n" "$pathname"
        grep "^>" "$pathname" | wc -l
    done' sh {} +

あなたのコマンド自体はファイル名を報告しないので、printfこれを言及する説明を追加しました。

関連:

関連情報