for loop in a bash script
0
0
Entering edit mode
10 weeks ago
Erika • 0

Hi! I have this bash script which is just for one file and I want to use for a multiple files in a folder. I have been trying with the for loop, but my script does not work. THanks in advance!

#!/bin/bash

# USAGE
# sh getSNPs_and_clean.sh vcf output_path
## Note this only works when we use chromosomes with sites to be exchanged
## Note this only works on one chromosome VCF

FILE=$1; # A VCF file multisample or mono sample

OUTPUT_PATH=$2;

file_name=${FILE%.vcf*};
file_name=${file_name##*/};

# SNPs
bcftools view --threads 40 -m2 -M2 -v snps -Oz -o ${OUTPUT_PATH}/${file_name}.snps.vcf.gz ${FILE}
bcftools index --threads 40 ${OUTPUT_PATH}/${file_name}.snps.vcf.gz
bcftools view --threads 40 -e 'POS=80294998' -Oz -o ${OUTPUT_PATH}/${file_name}.snpsTMP.vcf.gz ${OUTPUT_PATH}/${file_name}.snps.vcf.gz # without duplicates
mv -f ${OUTPUT_PATH}/${file_name}.snpsTMP.vcf.gz ${OUTPUT_PATH}/${file_name}.snps.vcf.gz
bcftools index --threads 40 ${OUTPUT_PATH}/${file_name}.snps.vcf.gz

echo "${FILE} completed!"
bash for script loop • 462 views
ADD COMMENT
0
Entering edit mode

what is the aim of that script ? finding the di allelic snps NOT at POS=80294998 ?

ADD REPLY
0
Entering edit mode

Its is just a correction

ADD REPLY
0
Entering edit mode

I want to put a for loop inside this script

ADD REPLY
0
Entering edit mode

Its is just a correction

what does that mean ?

as far as I can understand you don't need such complicated script, you don't need an index, you don't need two steps....

bcftools view   -m2 -M2 -v snps  -e 'POS=80294998' -Oz -o /apth/output.vcf.gz input.vcf
ADD REPLY
0
Entering edit mode

what I am trying to do is something like this (for multiple files):

#!/bin/bash

# USAGE
# sh getSNPs_and_clean.sh vcf output_path
## Note this only works when we use chromosomes with sites to be exchanged
## Note this only works on one chromosome VCF

FILE=$1; # A VCF file multisample or mono sample

OUTPUT_PATH=$2;

file_name=${FILE%.vcf*};
file_name=${file_name##*/};
for i in FILE
do
# SNPs
bcftools view --threads 40 -m2 -M2 -v snps -Oz -o ${OUTPUT_PATH}/${file_name}.snps.vcf.gz ${FILE}
bcftools index --threads 40 ${OUTPUT_PATH}/${file_name}.snps.vcf.gz
bcftools view --threads 40 -e 'POS=80294998' -Oz -o ${OUTPUT_PATH}/${file_name}.snpsTMP.vcf.gz ${OUTPUT_PATH}/${file_name}.snps.vcf.gz # without duplicates
mv -f ${OUTPUT_PATH}/${file_name}.snpsTMP.vcf.gz ${OUTPUT_PATH}/${file_name}.snps.vcf.gz
bcftools index --threads 40 ${OUTPUT_PATH}/${file_name}.snps.vcf.gz
done
echo "${FILE} completed!"
ADD REPLY
1
Entering edit mode

I'm not really sure what you're trying to do either, but in terms of simply running a loop, the example above has only one element for looping (FILE has only a single value), and you never use "i" in the rest of the code (so the loop appears to have no point). Don't you want something like:

FILES="*.vcf"

for i in FILES
do
    echo $i
    # shave off vcf extension                                                                                                                                                                    
    file_name=${i%.vcf*}
    echo "Now I can use $file_name as a base value."
    echo "${file_name}.snps.vcf.gz"
    # I don't know what this operation does
    file_name=${file_name##*/}
    echo $file_name
done

Create the simplest toy example and echo your file names to work out your loop, before inserting the complex command stuff.

ADD REPLY
0
Entering edit mode

, but my script does not work.

information is missing. What "does not work" ? how can we know ?

after #!/bin/bash add

set -e
set -x

to see what's happening and stop at errors.

you can also prefix your bcftools commands with echo to see what's happening.

ADD REPLY

Login before adding your answer.

Traffic: 2159 users visited in the last hour
Help About
FAQ
Access RSS
API
Stats

Use of this site constitutes acceptance of our User Agreement and Privacy Policy.

Powered by the version 2.3.6