首页 > 解决方案 > For 循环函数在 while 循环中不起作用

问题描述

我希望为我的基因列表中的每个基因重复相同的功能。这就是while循环的作用。然后它将文件从主文档中提取到一个新的床文件中。

number_of_lines 变量是文档中的行数。我想创建一个与 number_of_lines 对应的行数的文档

IE

number_of_lines=1

输出

1

number_of_lines=5

输出

5
5
5
5
5

我的代码如下

while read gene
do
    grep -w $gene $masterfile | awk '{print $1"\t"$2"\t"$3"\t"$5"\t"$6"\t"$4}' > $gene.bed
    number_of_lines=$(grep "^.*$" -c $gene.bed)
    echo $number_of_lines
    cat "" > $gene.1.bed
    for i in 'eval echo {1..$number_of_lines}'
    do
        echo $number_of_lines >> $gene.1.bed
    done
done < $genelist

如果我自己这样做

cat "" > $gene.1.bed
for i in 'eval echo {1..$number_of_lines}'
do
    echo $number_of_lines >> $gene.1.bed
done

有用?

标签: bashloops

解决方案


当您看到 时eval,您“知道”您的代码是错误的。@Barmar 已经指出了正常的构造for ((i=0; i<$number_of_lines; i++)),这里应该使用什么。由于所有行都具有相同的内容,您还有另一种可能性:yes. 我也做了一些其他的改变。

while read gene
do
    grep -w "${gene}" "${masterfile}" |
        awk 'BEGIN {OFS="\t";} {print $1, $2, $3, $5, $6, $4}' > "${gene}.bed"
    number_of_lines=$(wc -l < "${gene}.bed")
    echo "${number_of_lines}"
    yes "${number_of_lines}" | head -"${number_of_lines}" > "${gene}.1.bed"
done < "${genelist}"

推荐阅读