2017-03-02 83 views
0

目前我正在研究一个脚本,该脚本应该生成一些可以提交给群集的PBS脚本。我的正常脚本运行良好,但现在我面临着为一个程序输入两个文件的问题。我的一个脚本例如看起来像:如何在一个循环中获取两个文件

#!/bin/bash 

echo -e "#!/bin/bash\n 
#SBATCH --job-name=whatever 
#SBATCH --export=NONE 
#SBATCH --nodes=1 
#SBATCH --cpus-per-task=8 
#SBATCH --mem=80G 
#SBATCH --partition=blabla 
#SBATCH --blabla" >> $1 

echo -e "touch log_file_$1\n" >> $1 

x=$(cd $(dirname ${BASH_SOURCE[0]}) && pwd) 

for file in /foo/bar/foo/bar/*; do 
rl=$(readlink -f $file) 
kw=${rl##*/} 
id=${kw%%.*} 
gz_weg=${kw%.*} 

if [ ! -d "$id" ]; then 
    mkdir "$id" 
fi 

echo "echo $kw >> log_file_$1" >> $1 
printf "foo-bar --mode barbar -e 0.001 --index /barz/barz/barz.index --inFile $rl --output $x/$id/$gz_weg.rma 2>> $x/log_file_$1 \n" >> $1 
echo "echo -e '"\\n"' >> log_file_$1" >> $1 
echo -e "\n" >> $1 
done 

不是一个美丽我猜,但它适用于我。但现在如上所述,我面临着有两个输入文件的问题。他们都在同一个文件夹中,我试过类似的东西:

for file in /ifs/data/nfs_share/sukmb241/raw_data/samples/iceman_old/iceman.UDG.*/*.fastq.gz; do 

bs=$(basename $file) 

if [[ "$bs" == *R1* ]]; then 
    r1=$(readlink -f $file) 
    k1=${r1##*/} 
    id1=${k1%%.*} 
    gz_weg1=${k1%.*} 
fi 


if [[ "$bs" == *R2* ]]; then 
    r2=$(readlink -f $file) 
    k2=${r2##*/} 
    id2=${k2%%.*} 
    gz_weg1=${k2%.*} 
fi 


if [ ! -d "$id1" ]; then 
    mkdir "$id1" 
fi 

echo "echo $kw >> log_file_$1" >> $1 
printf "blablabla -in1 $r1 -in2 $r2 -f foo -r bar -l 25 -qt -q 20 -o $x/$id1/whatever -verbose 2>> $x/log_file_$1 \n" >> $1 
echo "echo -e '"\\n"' >> log_file_$1" >> $1 
echo -e "\n" >> $1 
done 
fi 

因为这些文件仅在R1或R2的文件名中有所不同。但是,我意识到这将无法正常工作,因为它只会给我一个文件。因此,如何解决-IN1指向包含R1的文件和-in2包含R2

感谢提前:)

回答

1

如果您保存您的论点事先变量的问题,那么你就可以更换论点的文件列表,并消耗他们每次两个:

out_file=$1 
set -- /ifs/data/nfs_share/sukmb241/raw_data/samples/iceman_old/iceman.UDG.*/*.fastq.gz 

while [[ -z $1 ]] 
do 
    # Get the next two filenames 
    file1=$1 
    file2=$2 
    # discard them from arguments 
    shift 2 

    # Then the rest of the script 
    bs1=... 
    # Use $out_file instead of $1 
done 

这可能会运行耗尽空间参数的风险,所以你可以通过修剪出来的路径节省一点:

out_file=$1 
dirpath=/ifs/data/nfs_share/sukmb241/raw_data/samples/iceman_old/ 
cd "$dirpath" 
set -- iceman.UDG.*/*.fastq.gz 
cd "$OLDPWD" 
while [[ -z $1 ]] 
do 
    # Get the next two filenames 
    file1="$dirpath/$1" 
    file2="$dirpath/$2" 
    # discard them from arguments 
    shift 2 
    ... 

如果所有R1文件具有相应R2文件,那么你就需要采取文件的两个在一个时间 - 只是循环遍历所有R1文件,然后采取相应的R2文件:

for file in /ifs/data/nfs_share/sukmb241/raw_data/samples/iceman_old/iceman.UDG.*/*R1*.fastq.gz; do 
    r1=$(readlink -f $file) 
    k1=${r1##*/} 
    id1=${k1%%.*} 
    gz_weg1=${k1%.*} 


    # Change R1 to R2 in filename 
    file=${file//R1/R2} 
    r2=$(readlink -f $file) 
    k2=${r2##*/} 
    id2=${k2%%.*} 
    gz_weg2=${k2%.*} 

    if [ ! -d "$id1" ]; then 
     mkdir "$id1" 
    fi 

    echo "echo $kw >> log_file_$1" >> $1 
    printf "blablabla -in1 $r1 -in2 $r2 -f foo -r bar -l 25 -qt -q 20 -o $x/$id1/whatever -verbose 2>> $x/log_file_$1 \n" >> $1 
    echo "echo -e '"\\n"' >> log_file_$1" >> $1 
    echo -e "\n" >> $1 
done 

file=${file//R1/R2}R2代替文件名中的R1,从而给出另一个文件名。

+0

你会很高兴将它包含到我的脚本中,以便它可以工作吗? Atm我没有足够的大脑能力来让它工作。 – JFS31

+0

@ JFS31是否所有'R1'文件都有对应的'R2'文件? – muru

+0

是的,他们有。在每个文件夹中有两个文件,例如:D0770_S23_L001_R1_001.fastq.gz和D0770_S23_L001_R2_001.fastq.gz,我需要处理。 – JFS31