複数の fastq ファイルのシーケンス番号を繰り返し計算します。

複数の fastq ファイルのシーケンス番号を繰り返し計算します。

fastq.gz で終わる fastq ファイルがたくさんあります。

rep1.fastq.gz
rep2.fastq.gz
rep3.fastq.gz
rep4.fastq.gz
.....

私の結果は次のとおりです。

rep1.fastq.gz 23516782
rep2.fastq.gz 45126780
rep3.fastq.gz 67543908
rep4.fastq.gz 76425368

ライン1は各入力ファイルを示し、ライン2は各ファイルのシーケンス数を示す。

これを達成するために、各ファイルのシーケンス数を計算し、各ファイルの後に書き込まれた数値を出力として作成する小さなbashスクリプトを作成しました。

for sample in *.fastq.gz;do echo -en $sample "\t";(zcat $sample|wc -l)/4|bc ;done

エラーが発生します: -bash: 予期しないトークン '/4' の近くに構文エラーがあります。

答え1

シーケンスごとに4行を想定して可能なすべてのエラーを無視します...上記のコマンドは次の形式を使用する必要があります。

for file in *.fastq.gz; do echo -en $file "\t";echo "$(zcat $file| wc -l)"/4 |bc;done

答え2

あなたはこれを実行しています:

(zcat $sample|wc -l)/4|bc

/4その中にある唯一のことは、シェルが理解していないので失敗します。何が欲しいのか疑問結果コマンドの値をzcat $sample|wc -l入力し、その値を印刷して/4に渡しますbc。その場合は、引用する$()必要があるだけでなく、()次のようにします。

echo "$(zcat $sample|wc -l)/4" | bc

したがって、これは次のことを意味します。

for sample in *.fastq.gz; do 
    echo -en $sample "\t"; echo "$(zcat $sample|wc -l)/4" | bc 
done

または、携帯性を向上させるには:

for sample in *.fastq.gz; do 
    printf '%s\t%s\n' "$sample" "$(echo "$(zcat "$sample" | wc -l)/4" | bc )"
done

または、次の場所で作業全体を完了することもできますawk

for sample in *.fastq.gz; do 
    printf '%s\t' "$sample"
    zcat "$sample" | awk '!(NR % 4){k++}END{print k}'
done

ただし、fastq形式の定義には、ファイルにシーケンスごとに4行しかないことを示す内容はありません。データに精通している場合は、このアプローチを使用できますが、任意のfastqファイルを処理する必要がある場合は4行しかないとは考えられず、専用ツールを使用することをお勧めします。

このQ&Aが面白いかもしれません。fastqファイルの読み取りとベース数を数える簡単な方法は何ですか?

しかもFASTQファイル形式仕様では、項目ごとに4行しかないと仮定できないことを示しています。つまり、過去7年間、臨床環境でヒトNGSデータを使用した幅広い経験から、私が見たすべてのファイルにはサンプルあたり4行しかありませんでした。しかし、私は長いデータの読み込みを扱っておらず、フォーマット自体がより多くのデータを読み取ることができるので、考慮する必要があります。

関連情報