我试图通过一个函数传递数据文件的每一行。除了文件中的数据之外,还将许多其他参数解析到函数中。对于每一行,总共解析了总共11个参数。由于某种原因,函数忽略了最后两个参数。
我的代码如下,输入数据的示例和运行代码的结果。有什么建议吗?
守则:
function exon_parse {
data=$1
CHROM=$(awk ' {print $1}' <<< $data )
CHROM_LENGTH=$(awk ' {print $2}' <<< $data )
EXON_LENGTH=$(awk ' {print $3}' <<< $data )
STRAND=$(awk ' {print $4}' <<< $data )
START=$(awk ' {print $5}' <<< $data )
STOP=$(awk ' {print $6}' <<< $data )
POLY_SITES=$(awk ' {print $7}' <<< $data )
Av_Cov_Min=$2
Min_SNPs=$3
REF=$4
BAM1=$5
BAM2=$6
BAM3=$7
BAM4=$8
BAM4=$8
BAM6=$10
OUTPUT_FILE=$11
echo $1
echo $2
echo $3
echo $4
echo $5
echo $6
echo $7
echo $8
echo $9
echo $10
echo $11
exit 0
}
INPUT_FILE="/filepath/confused_reads.txt_"
OUTPUT_FILE="/filepath/filtered_recovered_reads.txt"
Av_Cov_Min=40
Min_SNPs=10
REF="/filepath/Renamed_pmin.scaf.fa"
BAM1="/filepath/SRR573675.realigned.bam"
BAM2="/filepath/SRR573705.realigned.bam"
BAM3="/filepathSRR573706.realigned.bam"
BAM4="/filepath/SRR573707.realigned.bam"
BAM5="/filepath/SRR573708.realigned.bam"
BAM6="/filepath/SRR573709.realigned.bam"
count=1
while read line; do
if [[ $count == 1 ]]; then
count=$(( count + 1 ))
else
data=$line
exon_parse "$data" $Av_Cov_Min $Min_SNPs $REF $BAM1 $BAM2 $BAM3 $BAM4 $BAM5 $BAM6 $OUTPUT_FILE
fi
done < ${INPUT_FILE}
我没有打印出所有参数,而是获得以下内容:
$> ./exonTables_recoverLostReads.bsh
Scaffold10026 154793 6043 . 1 6043 93
40
10
/filepath/Renamed_pmin.scaf.fa
/filepath/SRR573675.realigned.bam
/filepath/SRR573705.realigned.bam
/filepath/SRR573706.realigned.bam
/filepath/SRR573707.realigned.bam
/filepath/SRR573708.realigned.bam
Scaffold10026 154793 6043 . 1 6043 930
Scaffold10026 154793 6043 . 1 6043 931
最后两个参数发生了什么变化?
输入文件的前几行是这样的(我构建了我的代码,因此它不会解析标题行):
scaffold scaff_length exon_length strand start stop total_polymorphic_sites
Scaffold10026 154793 6043 . 1 6043 93
Scaffold10026 154793 6043 . 1 6043 93
Scaffold10026 154793 6043 . 1 6043 93
Scaffold10575 154793 5235 . 22299 27533 103
Scaffold10575 154793 5235 . 22299 27533 103
答案 0 :(得分:3)
请尝试使用${10}
和${11}
。
Bash变量可以选择用{}
包围,以避免歧义,这是必要的情况之一。
然而,还有另一种惯用(和IMO清洁)方法来处理这个问题。将参数变量重新分配给命名变量,如下所示:
function exon_parse {
data=$1;shift
Av_Cov_Min=$1;shift
Min_SNPs=$1;shift
....
shift
内置版会导致$1
的内容被删除,$2
的内容将被删除&#34;进入$1
; $3
以及所有其他参数也会向下移动。
这使您可以访问所有参数,而无需引用任何高于$1
的位置变量,从而完全避免了这个问题。当然,这不是必要的,但我发现很容易忘记并且不小心输入$11
而不是${11}
。通过总是转移,我永远不必担心。