サブディレクトリ内の異なる数のファイルに対するループコマンド

サブディレクトリ内の異なる数のファイルに対するループコマンド

サブディレクトリにあるさまざまな数のファイルに対してコマンドを実行するスクリプトを作成する方法を見つけたいと思います。 72個のサブディレクトリがあり、それぞれにさまざまな数のサンプルファイル(fastq.gzファイル)があり、最大のサブディレクトリには20個のサンプルファイルがあります。次のコマンドを使用しましたが、サブディレクトリのファイル数が20個未満の場合は、空のフォルダとファイルがたくさんあります。

#!/bin/sh
TOPHAT_BINARY=/home/alex/tools/tophat-2.1.0.Linux_x86_64/tophat2
GENE_REFERENCE=/home/alex/toxo/ref/genes/ToxoDB-27_TgondiiME49.gff
BOWTIE_INDEX=/home/alex/toxo/ref/bwt/ToxoDB-27_TgondiiME49_Genome
P=10 #use 10 threads
for FILE_ID in {001..072}
do
 for SAMPLE_ID in {001..020}
 do
 $TOPHAT_BINARY -G $GENE_REFERENCE -p $P -o /home/alex/toxo/alignments/Nishi_${FILE_ID}/sample_${SAMPLE_ID} $BOWTIE_INDEX /home/junya/bioinfo/NGS/original/Nishikawa.cell/rename_and_link/Nishi_${FILE_ID}/*_${SAMPLE_ID}.fastq.gz &
 mv /home/alex/toxo/alignments/Nishi_${FILE_ID}/sample_${SAMPLE_ID}/accepted_hits.bam /home/alex/toxo/alignments/Nishi_${FILE_ID}/sample_${SAMPLE_ID}.bam
 done
done

スクリプトをどのように編集しますか?

for SAMPLE_ID in {001..020}

では、このコマンドは空のファイルを出力せず、特定のサブディレクトリ内の特定の数のファイルに対してのみ機能しますか?

一部のサブディレクトリには2、3、10、16などのファイル数が含まれているため、20個しかありません。したがって、サブディレクトリに2つのサンプルファイルがある場合、出力には18個の空のファイルが含まれます。...すべての空のファイルを削除するコマンドを追加しました。最後に動作しましたが、複数のサブディレクトリに含まれるファイルのみを指定する別の方法はありますか?

## secure and fast version ###
find /home/alex/toxo/alignments/Nishi_${FILE_ID} -type f -empty -print0 | xargs -0 -I {} /bin/rm "{}"

ベストアンサー1

Melの答えで問題が解決したようです。ここに別のバリエーションがあります。広範囲のSAMPLE_IDを繰り返すのではなく(予想される20個より多い場合はどうなりますか?)、bashのファイル名拡張子を使用して、実際に存在するすべてのサンプル_ *ファイルのみを繰り返すようにループを変更しました。ホーム/アレックス/toxo/alignments/Nishi_${FILE_ID}。私が使用しているSAMPLE_IDの元の値を取り戻すためにパラメータ拡張SAMPLE_ID ファイル名から最後の 3 文字を検索します。 Sample_*ファイルが999を超えると、問題が発生する可能性があります。

また、(envを介して)bashを明示的に呼び出すようにshe-bangヘッダー行を変更しました。呼び出しが/ bin / shの場合、bashはBourne Shellをエミュレートしようとし、Bourne Again SHellの機能(素晴らしいパラメータなど)を失うためです。拡張!)

追加ボーナスとしてSAMPLE_FILEをこの方法で使用すると、コマンドが短くなり、読みやすくなります。

#!/usr/bin/env bash
TOPHAT_BINARY=/home/alex/tools/tophat-2.1.0.Linux_x86_64/tophat2
GENE_REFERENCE=/home/alex/toxo/ref/genes/ToxoDB-27_TgondiiME49.gff
BOWTIE_INDEX=/home/alex/toxo/ref/bwt/ToxoDB-27_TgondiiME49_Genome
P=10 #use 10 threads
for FILE_ID in {001..003}
do
  for SAMPLE_FILE in /home/alex/toxo/alignments/Nishi_${FILE_ID}/sample_*
  do
    SAMPLE_ID=${SAMPLE_FILE: -3}
    $TOPHAT_BINARY -G $GENE_REFERENCE -p $P -o $SAMPLE_FILE $BOWTIE_INDEX /home/junya/bioinfo/NGS/original/Nishikawa.cell/rename_and_link/Nishi_${FILE_ID}/*_${SAMPLE_ID}.fastq.gz
    mv ${SAMPLE_FILE}/accepted_hits.bam ${SAMPLE_FILE}/sample_${SAMPLE_ID}.bam
    echo
  done
done

おすすめ記事