Dataというフォルダーに25の関連するファイルのペアがあります。これらのファイルには、tcr1_r1.txt
とtcr1_r2.txt
、tcr2_r1.txt
とtcr2_r2.txt
という名前が付けられ、tcr25…
(またはファイルペアの数)に達するまで続きます。私の問題は、それらをペアにして、バッチファイル内の各ペアでコマンドを実行する必要があることです。例:
コマンドtcr1_r1.txt tcr2_r2.txt コマンドtcr2_r1.txt tcr2_r2.txt
これどうやってするの?ループを考えていますが、各コマンドでファイルを分離して変更することができないようです。ネストされたループを試しましたが、すべての「r2」ファイルとともに各「r1」ファイルを実行するだけです。
for filename1 in /Data/*_r1.txt
do
for filename2 in /Data/*_r2.txt
do
echo "$filename1 and $filename2"
done
done
Jeff Schallerの答え を使おうとしました。私が試した正確なシェルファイルの行は次のとおりです。
#!/bin/bash
for first in /mnt/data/Sequencing_core/Data/Raw_data/062419_TCRB_Vanessa_Danielle/20190624_FS10000703_3_BPC29606-1232/Alignment_1/20190625_132145/Fastq/*R1_001.fastq.gz
do
echo "$first"
echo "${first/_R1_001.fastq.gz/_R2_001.fastq.gz}"
done
何かが足りないに違いありません。 「不正な置換」というエラーメッセージが表示されます。
ファイルの総数を気にするかどうかに応じて、2つの方法があります。
最初の方法では、ファイルの数が25(具体的には1から25という名前)であることがわかります。
for index in {1..25}
do
command tcr"${index}"_r1.txt tcr"${index}"_r2.txt
done
上記の(bash)シェルは、{1..25}
を数値の完全なセットに展開します。次に、これらの番号をペアのファイル名の適切な場所に置き換えます。
2番目の方法では、ファイルの数がわからないか、気になりません。
for first in tcr*_r1.txt
do
command "$first" "${first/_r1.txt/_r2.txt}"
done
上記では、すべての「r1」ファイルをループし、ペアの「_r2.txt」を「_r1.txt」の部分に置き換えています。
xargs
:を使用できます。
echo /Data/*_r[12].txt | xargs -n 2 the-command