首页 > 解决方案 > 根据文件中定义的次数打印变量(bash)

问题描述

我有
scaffold_$iwherei in {1..3015} 和一个制表符分隔的文件 ( temp),有 3015 个值(每行一个):

2
3
1
5

...

我必须按照文件第一行所示的次数打印第一项scaffold_1,这里是2,打印第二项scaffold_2 3 次,第三项6 次,依此类推。所以,我有:

scaffold_1
scaffold_1
scaffold_2
scaffold_2
scaffold_2
scaffold_3
scaffold_4
scaffold_4
scaffold_4
scaffold_4
scaffold_4

...

我已经得到:

for i in {1..3};do for j in 'cat temp'; do printf 'scaffold_'$i'\n'%.0s {1..$j}; done; done

但还没有。

标签: bashshellloopsawk

解决方案


我假设您实际上想要打印 $scaffold_1 的

使用 bash 你会做

scaffold_1=foo 
scaffold_2=bar 
scaffold_3=foobar 
scaffold_4=qux

n=0
while read count; do 
    ((n++))
    var="scaffold_$n"
    for i in $(seq "$count"); do echo "${!var}"; done
done < temp

或者,对于最近的 bash 版本,使用“nameref”

n=0
while read count; do 
    ((n++))
    declare -n ref="scaffold_$n"
    for i in $(seq "$count"); do echo "$ref"; done
done < temp
foo
foo
bar
bar
bar
foobar
qux
qux
qux
qux
qux

但是,看到 3000 个编号的变量名是很痛苦的。使用数组

scaffold=(
    foo 
    bar 
    foobar 
    qux
)
n=0
while read count; do 
    for i in $(seq "$count"); do echo "${scaffold[n]}"; done
    ((n++))
done < temp

推荐阅读