awk 问题(从用户定义的函数返回一个数组)

Posted

技术标签:

【中文标题】awk 问题(从用户定义的函数返回一个数组)【英文标题】:awk issue (return an array from user defined function) 【发布时间】:2012-09-03 04:38:12 【问题描述】:

我有这个功能(将 WGS84 大地水准面的坐标转换为笛卡尔坐标……没关系):

  function convert_geo_to_enu(coord_geo)  \
    xi=sqrt(1 - e*e*sin(coord_geo[1])*sin(coord_geo[2])); \
        \
        coord_enu[1]=(a/xi + coord_geo[3])*cos(coord_geo[1])*cos(coord_geo[2]); \
        print coord_enu[1] " hhh " ; \
        coord_enu[2]=(a/xi + coord_geo[3])*cos(coord_geo[1])*sin(coord_geo[2]); \
        coord_enu[3]=(a*(1-e*e)/xi0 + coord_geo[3])*sin(coord_geo[1]); \
    \
    return coord_enu \   # <-- here comes the problem
   \


problem --> mawk: line 64: illegal reference to array coord_enu

作为数组返回有什么问题?有什么不同的语法吗?

我可以使用:

  function convert_geo_to_enu(coord_geo, coord_enu)  \
       ...
       coord_enu[1]=...
       ...
   \

甚至:

  function convert_geo_to_enu(coord_geo)  \
       ...
       coord_enu[1]=...
       ...
   \

然后只使用变量coord_enu 作为全局变量?

但是使用 return 语句看起来更好(尤其是对我来说)

【问题讨论】:

删除所有行继续字符。它们不是必需的,may cause problems,而且肯定会妨碍可读性。 【参考方案1】:

有点晚了,但这是我使用的解决方案:

我发送了一个我想要填充的变量作为函数的参数:

function myfunct(result, array_size) 
    for(i = 1; i <= array_size; i++) 
        result[i] = ##whatever you want
    

然后,您可以将结果变量视为函数外部的数组

希望这对寻找答案的人有所帮助

【讨论】:

“永远不会太晚”:D!所以我可以awk "function myfunct(result,array_size) for(i=1; i&lt;=array_size;i++) result[i]= i+1 ; print result[1]; BEGIN abc = myfunct(a, 3); print a[3];" 谢谢! 来自手册页:参数[到函数]如果是标量则通过值传递,如果是数组则通过引用传递【参考方案2】:

将数组视为全局数组。 AWK 无法返回数组。

【讨论】:

能否提供参考? @sergj:gawk 输出的错误消息提供更多信息:“尝试在标量上下文中使用数组 'coord_enu'”。我将继续寻找文档,但在 gawkmawk 手册中并没有明确说明。 参考:gnu.org/software/gawk/manual/html_node/…

以上是关于awk 问题(从用户定义的函数返回一个数组)的主要内容,如果未能解决你的问题,请参考以下文章

awk 处理字符

awk

AWK

awk

shell awk操作如何使结果赋值进数组

awk工具