您好我有以下批处理脚本,我将每个文件提交到单独的处理,如下所示:
for file in ../Positive/*.txt_rn; do
bsub <<EOF
#BSUB -L /bin/bash
#BSUB -W 150:00
#BSUB -M 10000
#BSUB -n 3
#BSUB -e /somefolder/errors/%J.err
#BSUB -o /somefolder/errors/%J.out
while read line; do
name=`cat \$line | awk '{print $1":"$2"-"$3}'`
four=`cat \$line | awk '{print $4}' | cut -d\: -f4`
fasta=\$name".fa"
op=\$name".rs"
echo \$name | xargs samtools faidx /somefolder/rn4/Rattus_norvegicus/UCSC/rn4/Sequence/WholeGenomeFasta/genome.fa > \$fasta
Process -F \$fasta -M "list_"\$four".txt" -p 0.003 | awk '(\$5 >= 0.67)' > \$op
if [ -s "\$op" ]
then
cat "\$line" >> ../Positive_Strand/$file".cons"
fi
rm \$lne
rm \$op
rm \$fasta
done < $file
EOF
done
我无法将行中的列值($line
变量存储到$name
和$four
变量中,因此无法进行进一步的处理此外,欢迎任何编辑代码以获得更好版本的建议。
答案 0 :(得分:1)
如果您将EOF
更改为'EOF'
,那么您将更准确地禁用shell解释。您的问题是您的后退(`
)未被转义。
我修复了您的缩进并清理了一些代码。请注意,此处突出显示的语法并不理解cat <<'EOF'
。如果您在启用突出显示的情况下将其粘贴到vim
,那么您会看到该块的颜色完全相同,因为它只是一个字符串。
bsub_helper() {
cat <<'EOF'
#BSUB -L /bin/bash
#BSUB -W 150:00
#BSUB -M 10000
#BSUB -n 3
#BSUB -e /somefolder/errors/%J.err
#BSUB -o /somefolder/errors/%J.out
while read line; do
name=`cat $line | awk '{print $1":"$2"-"$3}'`
four=`cat $line | awk '{print $4}' | cut -d: -f4`
fasta="$name.fa"
op="$name.rs"
genome="/somefolder/rn4/Rattus_norvegicus/UCSC/rn4/Sequence/WholeGenomeFasta/genome.fa"
echo $name | xargs samtools faidx "$genome" > "$fasta"
Process -F "$fasta" -M "list_$four.txt" -p 0.003 | awk '($5 >= 0.67)' > "$op"
if [ -s "$op" ]
then
cat "$line" >> "../Positive_Strand/$file.cons"
fi
rm "$lne" "$op" "$fasta"
EOF
echo " done < \"$1\""
}
for file in ../Positive/*.txt_rn; do
bsub_helper "$file" |bsub
done
我创建了一个辅助函数,因为我需要在两个命令中获取输入。我假设$file
是该块中唯一要解释的变量。我还用引号包围了该变量(以及其他变量),以便代码可以支持带有空格的文件名。由于这个原因,助手的最后一行嵌套了双引号。
我单独离开了echo $name | xargs …
行,因为它很奇怪。如果$name
周围没有引号,xargs
会将每个以空格分隔的条目作为自己的文件。使用引号,xargs
只会向samtools
提供一个(可能无效的)文件名。
如果$name
是单个文件,请尝试:
samtools faidx "$genome" "$name" > "$fasta"
如果$name
多个文件并且没有空格,请尝试:
samtools faidx "$genome" $name > "$fasta"
在这里使用xargs
的唯一原因是,如果您有一个命令行的内容太多,但如果您正在运行echo $name | xargs
,那么您将遇到同样的问题问题