web-dev-qa-db-ja.com

bashシェルで2セットのファイルをループする

Dataというフォルダーに25の関連するファイルのペアがあります。これらのファイルには、tcr1_r1.txttcr1_r2.txttcr2_r1.txttcr2_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
Orion11

ファイルの総数を気にするかどうかに応じて、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」の部分に置き換えています。

3
Jeff Schaller

xargs :を使用できます。

echo /Data/*_r[12].txt | xargs -n 2 the-command
2
Wildcard