複数のファイルの結果に基づいて新しいファイルを作成し、ファイル名を最初の列に保つにはどうすればよいですか?

複数のファイルの結果に基づいて新しいファイルを作成し、ファイル名を最初の列に保つにはどうすればよいですか?

bam複数の(バイナリファイル形式)ファイルから特定の行を抽出したいと思います。以下を使用して単一のファイルから行を選択できますbam

samtools view -c TCGA-BH-A0BW-11A.sorted.bam "5:13744354-13744380"
550

次の100個のファイルを含むディレクトリがありますbam

TCGA-AC-A2FB-11A.sorted.bam
TCGA-AC-A2FF-11A.sorted.bam
TCGA-AC-A2FM-11B.sorted.bam
TCGA-AC-A2QH-01A.sorted.bam
TCGA-AC-A2QJ-01A.sorted.bam
TCGA-BH-A0BW-11A.sorted.bam
TCGA-BH-A0BW-01A.sorted.bam
TCGA-CH-A0BW-11A.sorted.bam

そのコマンドを複数のファイルに適用し、最初の列は拡張子のないファイル名で、2番目の列はそのファイルのコマンドの結果bamとして単一のファイルに出力を保存するにはどうすればよいですか?samtools

たとえば、次のようになります。

TCGA-BH-A0BW-11A     550
TCGA-BH-A0BW-01A     220
TCGA-CH-A0BW-11A     100

私はLinuxシステムで作業しています。

答え1

を使用している場合は、bash適切な拡張子を持つすべてのファイルを繰り返し、次のように処理できます。

for file in *.sorted.bam
do
    key="${file%.sorted.bam}"
    value="$(samtools view -c "$file" "5:13744354-13744380")"
    echo "$key $value"
done > output.txt

ループでは、

  • .sorted.bamファイル名の末尾から削除してファイルキーを生成し、それをシェル変数に保存しますkey
  • 単一ファイルの例に示す処理を実行し、出力をシェル変数に保存します。value
  • キーと値の印刷

ループの出力全体をファイルにリダイレクトしますoutput.txt

関連情報