
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行しかありませんでした。しかし、私は長いデータの読み込みを扱っておらず、フォーマット自体がより多くのデータを読み取ることができるので、考慮する必要があります。