【问题标题】:AWK Attempt to use scalar variable as an array errorAWK 尝试将标量变量用作数组错误
【发布时间】:2021-10-30 09:36:02
【问题描述】:
  • 我正在使用以下脚本:
    #!/usr/bin/awk -f
    BEGIN {
        FS = "[_.]"
    }
    
    function display() {
        if (length(gene_ids) > 1)
            for (j=0; j <= i; j++)
                print a[j]
    }
    
    {
        if (/^>Cluster /) {
            display()
            delete a
            delete gene_ids
            a[i=0] = $0
        } else {
            a[++i] = $0
            gene_ids[$7] = 1
        }
    }
    
    END {
        display()
    }
  • 处理以下文件:
>Cluster 0
0   3843aa, >9606_9d1c13f4f2796e1bc5d9c034d256608e_ENSP00000478752_3843_318_ENST00000621744_ENSG00000286185... *
1   3843aa, >9606_9d1c13f4f2796e1bc5d9c034d256608e_ENSP00000498781_3843_318_ENST00000651566_ENSG00000271383... at 1:3843:1:3843/100.00%
>Cluster 17
0   1388aa, >9606_e3f5b4b466cd2bae95842b586d4d5ff5_ENSP00000419786_1388_4_ENST00000465301_ENSG00000243978... *
1   1388aa, >9606_e3f5b4b466cd2bae95842b586d4d5ff5_ENSP00000441452_1388_4_ENST00000540313_ENSG00000243978... at 1:1388:1:1388/100.00%
>Cluster 34
0   1150aa, >9606_c6fca1c116a00dbb0d2e8930f4056625_ENSP00000353655_1150_26_ENST00000360468_ENSG00000196547... *
1   1150aa, >9606_c6fca1c116a00dbb0d2e8930f4056625_ENSP00000452948_1150_26_ENST00000559717_ENSG00000196547... at 1:1150:1:1150/100.00%
>Cluster 39
0   1072aa, >9606_64cead9c681fd594c83c17cc06748bb6_ENSP00000315112_1072_50_ENST00000324103_ENSG00000092098... *
1   1072aa, >9606_64cead9c681fd594c83c17cc06748bb6_ENSP00000457512_1072_50_ENST00000558468_ENSG00000259529... at 1:1072:1:1072/100.00%
>Cluster 271
0       551aa, >9606_95dbfd3f219d32f1cc1074a79bfc576d_ENSP00000415200_551_42_ENST00000429354_ENSG00000268500... *
1       551aa, >9606_95dbfd3f219d32f1cc1074a79bfc576d_ENSP00000470259_551_42_ENST00000599649_ENSG00000268500... at 1:551:1:551/100.00%
2       551aa, >9606_95dbfd3f219d32f1cc1074a79bfc576d_ENSP00000473238_551_42_ENST00000534261_ENSG00000105501... at 1:551:1:551/100.00%
>Cluster 284
0       547aa, >9606_8ed59e1e16a1229b55495ff661b5aa66_ENSP00000354675_547_9_ENST00000361229_ENSG00000198908... *
1       547aa, >9606_8ed59e1e16a1229b55495ff661b5aa66_ENSP00000361820_547_9_ENST00000372735_ENSG00000198908... at 1:547:1:547/100.00%
2       547aa, >9606_8ed59e1e16a1229b55495ff661b5aa66_ENSP00000391722_547_9_ENST00000448867_ENSG00000198908... at 1:547:1:547/100.00%
3       547aa, >9606_8ed59e1e16a1229b55495ff661b5aa66_ENSP00000403226_547_9_ENST00000457056_ENSG00000198908... at 1:547:1:547/100.00%
4       547aa, >9606_8ed59e1e16a1229b55495ff661b5aa66_ENSP00000405893_547_9_ENST00000447531_ENSG00000198908... at 1:547:1:547/100.00%
  • 这会产生以下输出:
>Cluster 0
0   3843aa, >9606_9d1c13f4f2796e1bc5d9c034d256608e_ENSP00000478752_3843_318_ENST00000621744_ENSG00000286185... *
1   3843aa, >9606_9d1c13f4f2796e1bc5d9c034d256608e_ENSP00000498781_3843_318_ENST00000651566_ENSG00000271383... at 1:3843:1:3843/100.00%
>Cluster 39
0   1072aa, >9606_64cead9c681fd594c83c17cc06748bb6_ENSP00000315112_1072_50_ENST00000324103_ENSG00000092098... *
1   1072aa, >9606_64cead9c681fd594c83c17cc06748bb6_ENSP00000457512_1072_50_ENST00000558468_ENSG00000259529... at 1:1072:1:1072/100.00%
>Cluster 271
0       551aa, >9606_95dbfd3f219d32f1cc1074a79bfc576d_ENSP00000415200_551_42_ENST00000429354_ENSG00000268500... *
1       551aa, >9606_95dbfd3f219d32f1cc1074a79bfc576d_ENSP00000470259_551_42_ENST00000599649_ENSG00000268500... at 1:551:1:551/100.00%
2       551aa, >9606_95dbfd3f219d32f1cc1074a79bfc576d_ENSP00000473238_551_42_ENST00000534261_ENSG00000105501... at 1:551:1:551/100.00%
  • 该脚本在我的测试机器(运行 GNU Awk 5.1.0,API:3.0)上运行起来非常棒。但是当我尝试在我的生产机器(运行 GNU Awk 5.1.0 或 GNU Awk 4.1.4)上运行脚本时,脚本给了我以下错误:
(FILENAME=test_cluster FNR=1) fatal: attempt to use scalar `gene_ids' as an array
  • 我已经通过运行以下命令测试了错误是否与length(array) 有关:
awk 'BEGIN{a[1]=10;a[2]=20;print length(a)}'

如建议here

  • 但这给了我所有机器的预期结果。

  • 我还使用以下代码测试了posix 变量的状态:

set -o | grep posix
  • 但是这些测试在我所有的机器上都给了我相同的结果(关闭)。

  • 鉴于我的生产机器都在运行 Ubuntu server 18.01,我也在 Ubuntu 20.01 server 机器上使用 AWK 进行了测试,但结果相同(不成功)。

  • 另外,鉴于我的测试机器(运行 GNU Awk 5.1.0)是一个通过 MacPorts 安装了 AWK 的 MacOS,我尝试使用相同的配置命令在我的 Ubuntu 机器上编译 AWK,但是在编译工作时,正在运行使用这个新编译的 AWK 的脚本也给了我同样的错误。

  • 如果能提供任何帮助确定问题的根源和可能的解决方案,我将不胜感激

【问题讨论】:

    标签: awk


    【解决方案1】:

    length(gene_ids) 声明 gene_ids 为标量,如果 gene_ids 以前未使用,因为历史上 length() 仅用于字符串(该行为将在即将发布的 gawk 版本中更改,因此 length() 不会设置如果之前未设置,则为它的参数类型)。

    将 delete gene_ids 添加到 BEGIN 部​​分以将其声明为数组,而不管脚本中现有行的命中顺序如何,这由您的输入数据驱动:

    $ awk 'BEGIN{ length(gene_ids); gene_ids[1] }'
    awk: cmd. line:1: fatal: attempt to use scalar `gene_ids' as an array
    
    $ awk 'BEGIN{ delete gene_ids; length(gene_ids); gene_ids[1] }'
    $
    

    【讨论】:

      猜你喜欢
      • 2014-03-16
      • 2012-09-03
      • 2013-09-10
      • 2013-03-20
      • 2020-04-10
      • 1970-01-01
      • 2014-07-11
      • 2015-10-16
      • 2017-11-25
      相关资源
      最近更新 更多