【问题标题】:Printing variables as many times as defined in a file (bash)根据文件中定义的次数打印变量(bash)
【发布时间】:2018-08-22 17:21:50
【问题描述】:

我有
scaffold_$ii 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

但还没有。

【问题讨论】:

    标签: bash shell loops awk


    【解决方案1】:

    我假设您实际上想要打印 $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
    

    【讨论】:

    • :) 这是我必须完成的另一项任务。感谢您的期待!
    【解决方案2】:

    最好使用awk

    awk '{a[NR] = $1} END {
       for (i=1; i <= length(a); i++)
          for (j=1; j <= a[i]; j++)
             print "scaffold_" i
    }' file
    

    scaffold_1
    scaffold_1
    scaffold_2
    scaffold_2
    scaffold_2
    scaffold_3
    scaffold_4
    scaffold_4
    scaffold_4
    scaffold_4
    scaffold_4
    

    【讨论】:

    • 您有时间介意解释一下吗?我真的很喜欢awk,但还不知道那么多。谢谢!
    • btw 如何定义以便可以从 0 开始打印?如脚手架_0。谢谢!
    • 只需使用print "scaffold_" i-10 开头
    【解决方案3】:

    另一个极简主义者awk

    $ awk '{while($1--) print "scaffold_"NR}' file
    
    scaffold_1
    scaffold_1
    scaffold_2
    scaffold_2
    scaffold_2
    scaffold_3
    scaffold_4
    scaffold_4
    scaffold_4
    scaffold_4
    scaffold_4
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-14
      • 1970-01-01
      • 1970-01-01
      • 2022-07-06
      • 2016-11-11
      • 2023-02-21
      相关资源
      最近更新 更多