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 数组,也不是标量”?