首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AWK试图将标量变量用作数组错误

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

Stack Overflow用户
提问于 2021-08-31 19:25:04
回答 1查看 135关注 0票数 1
  • 我使用以下脚本:
代码语言:javascript
复制
    #!/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()
    }
  • 若要处理以下文件:
代码语言:javascript
复制
>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%
  • 这将产生以下结果:
代码语言:javascript
复制
>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%
  • 这个脚本在我的测试机器(运行GNUAwk5.1.0,API: 3.0)上很有魅力。但是,当我试图在我的生产机器上运行脚本时(或者运行GNU Awk 5.1.0,或者运行GNU Awk 4.1.4),脚本会给出以下错误:
代码语言:javascript
复制
(FILENAME=test_cluster FNR=1) fatal: attempt to use scalar `gene_ids' as an array
  • 通过运行以下命令,我测试了该错误是否与length(array)相关:
代码语言:javascript
复制
awk 'BEGIN{a[1]=10;a[2]=20;print length(a)}'

如建议的那样这里

  • 但这给了我所有机器的预期结果。
  • 我还使用以下代码测试了posix变量的状态:
代码语言:javascript
复制
set -o | grep posix
  • 但这些测试在我所有的机器上都给了我同样的结果。
  • 考虑到我的生产机器都在运行Ubuntu服务器18.01,我还在Ubuntu20.01服务器上使用AWK进行了测试,但结果是相同的(不成功)。
  • 此外,如果我的测试机器(运行GNU 5.1.0)是一个通过MacOS安装的Awk,我尝试使用相同的配置命令在Ubuntu机器上编译AWK,但是当编译工作时,使用这个新编译的AWK运行脚本也给了我同样的错误。
  • 如果能帮助我找出问题的根源和可能的解决方案,我将不胜感激。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-31 19:33:03

length(gene_ids)gene_ids声明为标量,如果gene_ids以前未使用,因为过去length()只用于字符串(在即将发布的gawk版本中,这种行为将发生变化,如果以前未设置,length()将不会设置参数的类型)。

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

代码语言:javascript
复制
$ 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] }'
$
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69004344

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档