para loop ao combinar a frente e o verso do nome do arquivo

1

Estou tentando configurar um loop para executar um processo em pares de arquivos. Os nomes dos arquivos se parecem com isso

36_002_CGATGT_L001_R1_005.fastq.gz
36_002_CGATGT_L001_R2_005.fastq.gz

36_002_CGATGT_L001_R1_002.fastq.gz
36_002_CGATGT_L001_R2_002.fastq.gz

62_013_AGTCAA_L001_R1_003.fastq.gz
62_013_AGTCAA_L001_R2_003.fastq.gz

Eu preciso usar cada par no seguinte comando

sickle pe -f 36_002_CGATGT_L001_R1_005.fastq.gz \
 -r 36_002_CGATGT_L001_R2_005.fastq.gz\
 -o trimmed_36_002_CGATGT_L001_R1_005.fastq.gz\
 -p trimmed_36_002_CGATGT_L001_R2_005.fastq.gz\
 -s 36_002_CGATGT_L001_singles_005.fastq.gz

Para começar, estou tentando:

for n in *R1*; do m='basename $n R2' ; echo $m; done

mas claramente essa abordagem não está funcionando porque a frente e o verso do nome do arquivo são importantes. Preciso renomear arquivos para que o R1 e o R2 sejam a última parte do nome? O que seria estranho mas não impossível

    
por thermophile 24.02.2015 / 17:21

2 respostas

5

Se o seu shell for compatível com a forma de expansão do parâmetro ksh ${var/search/replace} ( ksh93 , zsh , mksh , yash , bash ):

for r1 in *R1*; do
  r2=${r1/R1/R2}
  singles=${r1/R1/singles}
  trimmed1=trimmed$r1
  trimmed2=trimmed$r2
  sickle pe -f "$r1" \
   -r "$r2" \
   -o "$trimmed1" \
   -p "$trimmed2" \
   -s "$singles"
done

POSIXly, você poderia fazer

 r2=${r1%%R1*}R2${r1#*R1}
    
por 24.02.2015 / 17:46
0

Supondo que eu entenda o que você está procurando, você pode resolvê-lo usando awk :

#!/bin/bash
for file in *_R1_*; do 
    file='basename $file'
    newFile='echo $file | awk -F '_R1_' '{print $1}''_R2_'echo $file | awk -F '_R1_' '{print $2}''
    sName='echo $file | awk -F '_R1_' '{print $1}''_singles_'echo $file | awk -F '_R1_' '{print $2}''
    echo $newFile
    rName="$newFile"
    oName="trimmed_$file"
    pName="$file"
done
    
por 24.02.2015 / 17:34