単一のコマンドで複数のファイルをGrepし、複数のファイルに出力

単一のコマンドで複数のファイルをGrepし、複数のファイルに出力

244ファイルから特定のパターンをgrepし、1つのコマンドで各ファイルに対して別々の出力ファイルを生成したいと思います。どうすればいいですか?

単一ファイルに対する私のコマンドは次のとおりです。

grep -v '@SQ' *.sam | grep -v '@HD' cut -f 3 | sort | uniq -c | sort -nrk1 > output_count_file.txt

個々のファイルごとに244回ではなく、一度にこれを行うにはどうすればよいですか?

私の入力ファイルの例は次のとおりです。

A1_001.fastq.sam
A2_001.fastq.sam
B6_001.fastq.sam

これらの入力ファイルの一部の情報を対応する出力ファイルにインポートしたいと思います。たとえば、次のようになります。

A1_001.txt
A2_001.txt
B6_001.txt

これらの出力ファイルから出力ファイルの情報を別のファイルにマージするには、grepを再実行する必要があります。

これらのファイルの1つ(A1_001.fastq.samなど)をgrepすると、次の結果が表示されます。

33 chr20:4804587-4804609__hsa_VP64_wgcod_3_27753
33 chr13:113242648-113242670__hsa_VP64_wgcod_2_46197
32 chr8:144718034-144718056__hsa_VP64_wgcod_2_48778
30 chr6:24126264-24126286__hsa_VP64_wgcod_1_71312

次の情報を含む参照ファイルと比較して、2番目の列(chr20:4804587-4804609など)で遺伝子名を識別する必要があります。

GTGCGCAGCGCTGAGTGTCG    YBEY    NM_001006114_utr5_0_0_chr21_47706267_f;NM_058181_utr5_0_0_chr21_47706267_f  chr21   47706143    47706165
AGCAGGCGGACAGTAGGACG    AUP1    NM_181575_utr5_11_0_chr2_74756757_r chr2    74757053    74757075
TAGGGGCAATGAATGGCGAG    APEX2   NM_001271748_utr5_0_0_chrX_55026756_f;NM_014481_utr5_0_0_chrX_55026756_f    chrX    55026610    55026632

私の質問があまりにも複雑ではないことを願っています。

答え1

フラグを使用してfindこれを達成できます-exec。その後、ディレクトリ内のすべてのファイルを繰り返し、grep各ファイルを個別に実行します。出力ファイルを区別するためにプレースホルダーを配置できます。

コマンドは次のとおりです。

$ find . -iname "*.sam" -exec grep -v '@SQ' {} | grep -v '@HD' cut -f 3 | sort | uniq -c | sort -nrk1 > {}_output_count_file.txt \;

注:まだテストしていないため、エスケープやプレースホルダに関するいくつかの問題を解決する必要があるかもしれませんが、始めるだけです。

答え2

単一のファイルを処理できる関数を作成できることを確認してください。

doit() {
  sam=$1
  grep -v '@SQ' "$sam".sam |
    grep -v '@HD' |
    cut -f 3 |
    sort |
    uniq -c |
    sort -nrk1 > "$sam"_count.txt
}
export -f doit

parallel doit {.} ::: *.sam

関連情報