2024年4月29日发(作者:)

用法:

Unix: awk '/pattern/ {print "$1"}' # 标准 Unix shell环境

DOS/Win: awk '/pattern/ {print "$1"}' # DJGPP 可编译通过

awk "/pattern/ {print "$1"}" # GnuWin32,UnxUtils,Mingw环境

需要特别注意的是,DJGPP编译器可以允许awk脚本使用Unix的引号语法

'/like/ {"this"}'。但是,用户必须知道在DOS/Windows环境下,使用或者

程序的话,单引号并不能保护重定向符号(<, >)和管道(|)。

如果使用双引号的话,在DOS/CMD命令解释器下的特殊符号和他们的特殊含义都

会被忽略。如果你的命令提示符是bash、ksh或者其他的Unix终端,单引号和双引号

会沿用Unix标准的用法。

同样,DOS/Win用户必须记住用,百分号(%)用来标记DOS/Win环境变量,

如果想要在awk使用的话,需要使用双百分号(%%)来表示一个百分号%。

如果我能确定一个脚本不需要被指出是使用在Unix, DOS或者CMD环境下,我通常

会省略引号。如果一个例子是GNU awk所特有的,将会用 'gawk'命令来代替。如

果你发现错误或者新的命令想要添加到这个列表里(总长度控制在65个字符一下)

,请通知我。首先我经常会尝试去写一个最短字符的脚本。为了省空间,我通常使用

'1'来代替'{print}'去打印每行,两种写法都能正确运行。

文本间隔:

# 每行后面增加一行空行

awk '1;{print ""}'

awk 'BEGIN{ORS="nn"};1'

# 每行后面增加一行空行。输出文件不会包含连续的两个或两个以上的空行

# 注意:在Unix系统, DOS行包括的 CRLF (rn) 通常会被作为非空行对待

# 因此 'NF' 将会返回TRUE。

awk 'NF{print $0 "n"}'

# 每行后面增加两行空行

awk '1;{print "n"}'

编号和计算:

# 以文件为单位,在每句行前加上编号 (左对齐)

# 使用制表符 (t) 来代替空格可以有效保护页变的空白。

awk '{print FNR "t" $0}' files*

# 用制表符 (t) 给所有文件加上连贯的编号。

awk '{print NR "t" $0}' files*

# 以文件为单位,在每句行前加上编号 (编号在左,右对齐)

# 如果在DOS环境下,需要写两个'%'

awk '{printf("] : %sn", NR,$0)}'

# 给非空白行的行加上编号

# 记得Unix对于 r 的处理的特殊之处。(上面已经提到)

awk 'NF{$0=++a " :" $0};{print}'

awk '{print (NF? ++a " :" :"") $0}'

# 计算行数 (模拟 "wc -l")

awk 'END{print NR}'

# 计算每行每个区域之和

awk '{s=0; for (i=1; i<=NF; i++) s=s+$i; print s}'

# 计算所有行所有区域的总和

awk '{for (i=1; i<=NF; i++) s=s+$i}; END{print s}'

# 打印每行每区域的绝对值

awk '{for (i=1; i<=NF; i++) if ($i < 0) $i = -$i; print }'

awk '{for (i=1; i<=NF; i++) $i = ($i < 0) ? -$i : $i; print }'

# 计算所有行所有区域(词)的个数

awk '{ total = total + NF }; END {print total}' file

# 打印包含 "Beth" 的行数

awk '/Beth/{n++}; END {print n+0}' file

# 打印第一列最大的行

# 并且在行前打印出这个最大的数

awk '$1 > max {max=$1; maxline=$0}; END{ print max, maxline}'

# 打印每行的列数,并在后面跟上此行内容

awk '{ print NF ":" $0 } '

# 打印每行的最后一列

awk '{ print $NF }'

# 打印最后一行的最后一列

awk '{ field = $NF }; END{ print field }'

# 打印列数超过4的行

awk 'NF > 4'