This is a test version of Biostars. For the public version, visit https://www.biostars.org.
Nest 2 for loops in a single command line

Hi, community! I want to transform BED to VCF files, but I will use echo to simplify the example. For that, I have two folders to access my BED files.

directory A:              /home/caroca/strains/
folders:                  SRR800856  SRR800857  SRR800858

directory  B:             /home/caroca/strains/strain/results/
files for 1 folder:       SRR800856_ngs_nonredundant.bed SRR800856_rel_nonredundant.bed

This is my code:

for i in SRR*; do 
    cd  /home/caroca/strains/$i/results ; 
    for file in  /home/caroca/strains/$i/results/$i_*_.nonredundant.bed ; do 
        echo $file ;
    done ;
done

This is the stdout:

/home/caroca/strains/SRR800856/results/*_.nonredundant.bed
/home/caroca/strains/SRR800857/results/*_.nonredundant.bed
/home/caroca/strains/SRR800858/results/*_.nonredundant.bed

As you can see, the "*" should not stay there, instead it should be (the files of each folder):

/home/caroca/strains/SRR800856/results/SRR800856_ngs_nonredundant.bed
/home/caroca/strains/SRR800856/results/SRR800856_rel_nonredundant.bed

I tried multiple combinations and I don't know how to tackle it. Thank you in advance!

bash for loops

Hi,

Not sure if the error is related, but can you try this:

for i in SRR*; do cd  /home/caroca/strains/$i/results ; for file in  /home/caroca/strains/$i/results/${i}_*_.nonredundant.bed ; do echo $file ; done; done

I think you need to add {} because _ might be a special character: ${i}.

António

Thank you for your reply. Although this is what I got:

 /home/caroca/strains/SRR800854/results/SRR800854_*_.nonredundant.bed
  /home/caroca/strains/SRR800855/results/SRR800855_*_.nonredundant.bed
  /home/caroca/strains/SRR800856/results/SRR800856_*_.nonredundant.bed
  

I think you need to spend some time understanding bash wildcards and parameter expansion.

I would also suggest using find with its -exec flag for this instead.

Thank you! I don't have a lot of experience with bash but I will pay a close look at that. Thanks

1 answer

What about this:

for i in /home/caroca/strains/SRR*; do for f in $i/results/*nonredundant.bed; do echo $f; done; done

also you can have the same result in one loop:

for f in /home/caroca/strains/SRR*/results/*nonredundant.bed; do echo $f; done;

Thank you so much for your help!! It was really clever!! I don't have a lot of experience with bash, but I am on it.
Thanks!

$ for f in /home/caroca/strains/SRR*/results/*nonredundant.bed; do echo $f; done;

is this equivalent to

$ find  /home/caroca/strains/SRR* -type f -name "*nonredundant.bed" ?

yes, but only for printing the name files. Caro-ca generalized the example. In fact, he wants to apply a conversion from bed to vcf. Thence, he will replace echo with something else.

Of course he can use find command and then xargs to do the same thing. But maybe it is better for him to have one step at a time

Log in to answer this question.