其他
写了100多个shell脚本的老司机的翻车之旅
在写shell脚本上,我就算不是一名老司机,也算是一名合格司机了。
基本上,大部分重复的任务都被我写成了脚本,比如说下面这个脚本就是我用于重测序找variant用的脚本。
#!/bin/bash
# version 1.1# function: provide different function to align and vairant calling
# author: xuzhougeng, xuzhougeng@163.com
# parameter: samplePath, index, reference threads
set -e
set -u
set -o pipefail
PATH=/home/xzg/miniconda3/bin:/usr/local/bin:/usr/bin:/bin
echo "you should run this program in the project root path "if [ $# -lt 4 ]
then
echo -e "$# less than 4, please enter samplePath, index, reference and threads"
exit 1fi
samplePath=$1index=$2suffix=$3threads=$4reference=${index}
mkdir -p alignment
alignDir=alignment
# alignmentfor sample in `cat $samplePath`
do
filename=${sample##*/}-${suffix}
echo "processing $filename with bwa"
if [ ! -f $alignDir/${filename}.sam ]
then
bwa mem -t 8 -B 2 $index ${sample}_1.fq.gz ${sample}_2.fq.gz >\
$alignDir/${filename}.sam 2> $alignDir/${filename}.log
echo "$filename done"
else
echo "$filename exists"
fi
done
# convert sort and index
# warning total memoery > threads x memeoryfor sample in `cat $samplePath`
do
echo "processing $filename with samtools"
output=${sample##*/}-${suffix}
samtools view -@ $threads -b -o $alignDir/${output}.bam $alignDir/${filename}.sam
samtools sort -@ $threads -m 1G -o $alignDir/${output}.sorted.bam $alignDir/${output}.bam
samtools index -@ $threads $alignDir/${output}.sorted.bam
echo "$filename done"done
# vairant calling with bcftools
mkdir -p variant_bcftools
varDir=variant_bcftoolsfor sample in `cat $samplePath`
do
output=${sample##*/}-${suffix}
echo "processing $sample with bcftools"
samtools mpileup -vu -t AD,DP -f $reference $alignDir/${output}.sorted.bam | \
bcftools call -vm -Ov > $varDir/${output%%.*}_raw_variants.vcf && echo "$sample done " &
done
但是今天我遇到了一个非常灵异的现象。
我和往常一样,用在我的ATOM文本编辑器中新建了一个配置文件,提供另一个脚本所需要的参数
# test.cfg
dir=/mnt/f/Data/test/Data/Seq
hawkDir=/home/xzg/biosoft/hawk
jellyfishDir=/home/xzg/biosoft/jellyfish-Hawk/bin
sortDir=/home/xzg/biosoft/coreutils/bin
CORES=2KMERSIZE=31
而在另一个脚本,我用awk提取cfg里面的参数,然后遍历里面的文件夹的内容
#!/bin/bash
set -e
set -u
set -o pipefail
#modified from NIKS script
#echo $PATH
...
config=$1if [ ! -f ${config} ] && [ ! -r ${config} ]
then
echo -e "$1 is not a file or is not readable \n "fi
# setting
dirs=$(awk 'BEGIN{FS="="}; $1~/dir/ { print $2}' $config)
hawkDir=$(awk 'BEGIN{FS="="}; $1~/hawkDir/ { print $2}' $config)
jellyfishDir=$(awk 'BEGIN{FS="="}; $1~/jellyfishDir/ { print $2}' $config)
sortDir=$(awk 'BEGIN{FS="="}; $1~/sortDir/ { print $2}' $config)
CORES=$(awk 'BEGIN{FS="="}; $1~/CORES/ { print $2}' $config)
KMERSIZE=$(awk 'BEGIN{FS="="}; $1~/KMERSIZE/ { print $2}' $config)for dir in ${dirs}
do
cd $dir
OUTPREFIX=$(basename ${dir})
mkdir -p ${OUTPREFIX}_kmers
...
然后当我运行的时候, 提示我不存在文件夹!
我觉得这不可能呀,应该有这个文件夹呀,我用ls验证了一下
你看吧,的却是有这个文件的,你居然不认识,这简直不可思议。
于是我决定自己定义文件夹的路径了,然而依旧报错了!
for dir in ${dirs}
do
dir=/mnt/f/Data/test/Seq/EF
OUTPREFIX=$(basename ${dir})
mkdir -p ${OUTPREFIX}_kmers
...
这很不科学,于是我放弃了进入文件路径的想法, 决定直接新建文件得了,于是改了一下代码
for dir in ${dirs}
do
OUTPREFIX=$(basename ${dir})
mkdir -p ${OUTPREFIX}_kmers
还是出错了。但是我发现一个非常奇怪的符号 \r
, 我的文件夹没有这个部分呀。
突然间,我好像知道了些什么!
真相就是我这个文件是在Windows下建立的,他的换行符是\M$
, 而不是$
。
知道真相的我的眼泪流下来!我的半个小时活活就被这个换行符给消耗没了!你要知道看起来我写起来没几行内容,但是折腾的过程是多么心塞,你知道吗
所以
Windows和Linux交互的时候一定要注意换行符!!!
Windows和Linux交互的时候一定要注意换行符!!!
Windows和Linux交互的时候一定要注意换行符!!!
不说,我要回去静静