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'
发布评论