在变量中存储一行

时间:2015-11-10 21:33:14

标签: shell variables awk

您好我有以下批处理脚本,我将每个文件提交到单独的处理,如下所示:

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变量中,因此无法进行进一步的处理此外,欢迎任何编辑代码以获得更好版本的建议。

1 个答案:

答案 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,那么您将遇到同样的问题问题