2012年5月29日星期二

关于AWK的絮絮叨叨

* 没啥特别重要的知道的可说的东西。

* HelloWorld首先:awk 'BEGIN{print "helloworld"}'

* 写在文件里,开头用 #!/bin/awk -f

* 变量不声明即有默认值,根据类型是0或空字符串。变量是全局的,局部通过函数的参数的形式来实现。

* awk可用来处理文本数据,和排版输出文本。

* 默认以一行为一条记录,$1 $2 ...依次为每行的字段(共NF个)。分割行和字段的方式可以自定义,文本的处理过程中是以行为单位触发处理事件的。

* 记录用正则FS分割,当前行号是NR

* 变量x用“x+0”转为数字,用“x ""”转换为字符串,比较运算符当有一侧为字符串时,都自动转换为字符串。

* 识别的方式可以在识别过程中修改。

* 有一堆系统变量可以读取和设置。

* awk文件由多个“pattern { action }”构成,当模式的条件匹配后,会执行对应的命令。

* 在规则中next和exit仅作用于当前行的匹配。

* 模式可以是空或BEGIN/END或正则表达式或条件语句

* 关联数组是字符串到变量值的映射,in操作符可用于if判断和for循环,具体使用方法照着示例代码用即可。

* 多维数组,即C语言中数组的数组,是用SUBSEP拼接下标。

* man 可参阅 http://www.manpagez.com/man/1/awk/ 。

* man里有教程、用法、示例和参考列表。

* 自带里数学/字符串/数组/IO/系统方面的一些函数。

* 字符串连接是空格,逗号是分隔符。

* 自定义的函数不可以复制给变量。

* 基本语法和C和bc都差不多。

* 正则表达式扮演了很重要的角色,比perl的正则功能上简单。

* 交互接受用户输入可以用“getline input "-"”,然后使用input变量即可(留空则$0)。

* 输出有print语句和printf函数,可输出到屏幕或文件。

* 可以干bc/sed/shell可以干的活,可以放在shell里面干活,可配合管道(getline,print,system)使用。

* 执行命令或输出到文件,相同字符串的所代表可以一直使用,直到close它。例如“while(getline<"file">0)”是从文件不断读取行。

* 输出到错误输出使用“print message I "cat 1>&2"”。

* 命令行的参数ARGC、ARGV需在BEGIN中处理,之后将被当作是读入的文件名。

* the awk language里有实现若干排序算法和对awk文法进行解析的例子。

* 若干常见实例参考::《SED 单行脚本快速参考》的 awk 实现 http://linuxtoy.org/archives/sed-awk.html 。

* mawk在windows下可用。

* ideone.com里也有awk可玩。

* 写python然后“python -c 'for i in file("a.txt"):print i'”作用和“awk '{print $0}' a.txt”差不多。

* 不论手段,在更高效的前提下,把文本处理完就行。

* 有时候不用来处理文本也行。

* 不用awk也行。

* 很多情况用文本编辑器也行。

* 若干示例
+ 显示文件:awk '{print}'
+ 加行号:awk '{print NR,$0}'
+ 去行号:awk '{sub(/^[0-9]+ /,"");print}'
+ 统计行数:awk 'END{print NR}'
+ 排序:awk '{A[NR]=$0}END{asort(x);for(i=1;i<=NR;i++)print A[ i]}'
+ 计算均值:awk '{S+=$0}END{print S/NR}'
+ 另一种均值写法:awk 'BEGIN{for(i=1;i

没有评论: