2014-05-19 60 views
0

我在兩個單獨的目錄中有一系列文件,我希望彼此匹配。該術語是這樣的:通過for循環匹配兩個文件(Bash)

正向目錄: 1_A_R1_Paired.gz, 1_B_R1_Paired.gz, 2_A_R1_Paired.gz, 2_B_R1_Paired.gz 等

反向目錄: 1_A_R2_Paired.gz, 1_B_R2_Paired.gz , 2_A_R2_Paired.gz, 2_B_R2_Paired.gz 等

我想設置我的for循環,這樣只對匹配的文件執行我的命令S R1和R2,這樣的結果將是:

my_command 1_A_R1_Paired.gz 1_A_R2_Paired.gz > 1_A_R1R2.bam 

但不是:

my_command 1_A_R1_Paired.gz 1_B_R2_Paired.gz > 1_AB_R1R2.bam 

別人這裏有一個類似的問題:bash: for loop, two variables linked。該解決方案是:

for f in dir1/*.fq; do 
    b=$(basename "$f") 
    f2=dir2/"$b".sa 
    if test -f "$f2"; then 
     mycommand "$f2" "$f" >"$b".sa.cc 
    fi 
done 

不幸的是,這並不適用於我,可能是因爲我的文件沒有相同的基本名稱。有人可以給我一個建議嗎?我是這裏的新手。

回答

0

如果兩個文件的基準名稱不完全匹配,則可以更改要查找的文件的名稱,例如使用sed

一個解決辦法是這樣的:

for f in dir1/*.qz; do 
    b=$(basename "$f") 
    f2=`sed s/R1/R2/ <<< "dir2/$b.gz"` 
    if test -f "$f2"; then 
     mycommand "$f" "$f2" > "$b".sa.cc 
    fi 
done 

注意,sed命令應調整以適應你的模式,現在則是簡單地用R2更換第一R1

+1

我會建議使用'$ {B // R1/R2}',而不是分叉很多'sed'命令...... – twalberg

+0

這個解決方案也行得通,儘管我不確定爲什麼,因爲sed的使用對我來說不太清楚。 – user3652862

0

爲了得到對,先拿到前綴和後綴:

for file in *R1*.gz 
do 
    prefix="${file%R1*}" 
    suffix="${file#*R1}" 
    if [ -f "${prefix}R2${suffix}" ] 
    then 
     my_command "${prefix}R1${suffix}" "${prefix}R2${suffix}" > "1_A_R1R2.bam" 
    fi 
done 
+0

這個工作很好,一旦我弄清楚我是個傻瓜這個事實。謝謝! – user3652862