AWK 尝试将标量变量用作数组错误

Posted

技术标签:

【中文标题】AWK 尝试将标量变量用作数组错误【英文标题】:AWK Attempt to use scalar variable as an array error 【发布时间】: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 'BEGINa[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 的脚本也给了我同样的错误。

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

【问题讨论】:

【参考方案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] '
$

【讨论】:

以上是关于AWK 尝试将标量变量用作数组错误的主要内容,如果未能解决你的问题,请参考以下文章

类型错误:只有长度为 1 的数组可以转换为 Python 标量,同时使用 Kfold 交叉验证

不正确的语法必须声明标量变量

PHP致命错误:未捕获的错误:不能将stdClass类型的对象用作数组

Python OpenCV - ConvexHull 错误“点不是 numpy 数组,也不是标量”?

[我正在用一本书在python中学习opencv,但出现此错误:只能将整数标量数组转换为标量索引

将浮点数与数组中的值进行比较时,“TypeError:只能将整数标量数组转换为标量索引”