免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2198 | 回复: 6
打印 上一主题 下一主题

[文本处理] awk 的几个问题 [复制链接]

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2018-09-04 18:48 |只看该作者 |倒序浏览
本帖最后由 104359176 于 2018-09-04 18:50 编辑

在 AWK 中,单引号似乎只有在命令行中使用,但这是 shell 的语法,在 awk 内部,单引号有什么用?

AWK 没有命名空间,那么定义自定义函数是在 BEGIN 后面,END 前面吧。

在 AWK 中,正则匹配是否比遍历字符更快?

例如判断一个字符串是否都是大写字母:

  1.      if (str ~ /^\u+$/) ...
  2. for (i = 1; i < length(str); i++) {
复制代码
awk 有处理极限吗?和别的脚本语言比,速度如何?

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
2 [报告]
发表于 2018-09-05 09:11 |只看该作者
你都会Perl6了,还用啥awk啊

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
3 [报告]
发表于 2018-09-06 17:37 |只看该作者
因为有台平板,很多时候在平板上写代码,发现唯一能支持的语言,就是包装在 Busybox 中的 AWK 语言。连 C 语言的编译器都找不到。

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
4 [报告]
发表于 2018-09-06 17:43 |只看该作者
回复 2# syscooker

确实是这样,单引号在 awk 中被浪费了。
function 定义确实可以在任意地方,但 awk 还是有很多坑,等待去填平。

例如,局部变量塞到参数列表中,前面至少有几个空格?

在 END 块中写入代码,执行后,发现系统一直在等待,不执行这些代码,不知道为啥。

一个 array, 在 return 的环境中,竟然提示是标量环境。

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
5 [报告]
发表于 2018-09-08 09:43 |只看该作者
回复 6# syscooker

这个函数是文档定义的函数,就是塞入空格,文档中也说明:这是唯一的定义函数局部变量的方式:

  1. function readfile(file,     tmp,contents) {
  2.   contents = ""
  3.   while ((getline tmp < file) > 0)
  4.     contents = contents tmp
  5.   close(file)
  6.   return contents
  7. }
复制代码
关于 array 的上下文问题,我的代码如下:


  1. function newArray(     arr) {
  2.   arr["back"] = 0
  3.   arr["front"] = 0
  4.   return arr
  5. }

  6. BEGIN {
  7.   arr = newArray()
  8. }
复制代码
我使用的awk 版本是 4.14, 我怀疑是版本问题,打算重新升级:
  1. $ awk -V
  2. GNU Awk 4.1.4, API: 1.1 (GNU MPFR 3.1.5-p2, GNU MP 6.1.2)
  3. Copyright (C) 1989, 1991-2016 Free Software Foundation.
复制代码



论坛徽章:
0
6 [报告]
发表于 2018-09-08 16:49 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
7 [报告]
发表于 2018-09-10 07:47 |只看该作者


  1. Controlling Variable Scope
  2. ==========================

  3. Unlike in many languages, there is no way to make a variable local to a '{' ... '}' block in 'awk', but you can make a variable local to a function.  It is good practice to do so whenever a variable is needed only in that function.

  4. To make a variable local to a function, simply declare the variable as an argument after the actual function arguments.
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP