1.8 有用的一句话程序
尽管Awk能被用来写相当复杂的程序,但大多数有用的程序并不会比目前学的更复杂。下面给出一些短程序,可能会对你有用,或者有启发性,或者兼而有之。这些程序大多是我们之前所学样例的变种。
打印输入行数
END { print NR }
打印前10行
NR <= 10
打印第10行
NR == 10
从第1行开始,每10行打印一行
NR % 10 == 1
打印每行的最后一个域
{ print $NF }
打印最后一行的最后一个域
END { print $NF }
打印超过4个域的行
NF > 4
打印不是4个域的行
NF != 4
打印最后一个域的值大于4的行
$NF > 4
打印所有域的总数
{ nf += NF }
END { print nf }
打印含有Beth的所有行的总数
/Beth/ { nlines++ }
END { print nlines }
打印第一个域的最大值以及其所在的行(假定 $1 都是正数)
$1 > max { max = $1; maxline = $0}
END { print max, $0 }
打印至少有一个域的行(即非空,且非只包含空白字符)
NF > 0
打印超过80个字符的行
length($0) > 80
在每行前面加入域的数量
{ print NF, $0 }
打印每行的前两个域,并调换顺序
{ print $2, $1 }
打印每行时,调换每行的前两个域,其他域不变
{ temp = $1; $1 = $2; $2 = temp; print }
在每行前面加入行号
{ print NR, $0 }
将每行的第一个域替换成行号
{ $1 = NR; print }
把每行的第二个域删掉
{ $2 = ""; print }
把所有域倒序输出
{ for (i = NF; i > 0; i--) printf("%s ", $i)
printf("\n")
}
对每行的所有域求和并打印
{ sum = 0
for (i = 1; i <= NF; i++) sum = sum + $i
print sum
}
对所有行的所有域求和并打印
{ for (i = 1; i <= NF; i++) sum = sum + $i }
END { print sum }
把所有行的所有域都替换成绝对值
{ for (i = 1; i <= NF; i++) if ($i < 0) $i = -$i
print
}
1.9 接下来呢
现在你已经了解Awk的基础。Awk程序就是 样式-动作 语句的序列。Awk按顺序检查每行的样式,当样式匹配时就执行相应的动作。样式可以包含数值和字符串比较,动作可以包含计算和格式化输出。除了自动读入输入行,Awk还会将每行分割成域。Awk还提供了一些内置的变量和函数,也允许你自己定义。把这些特性结合起来,很多有用的计算就能用很短的程序来表达,因为这些在其他语言里需要自己处理的细节,Awk已经帮你默默地处理了。
本书的后续部分详细地阐述了这些基本思想。我们建议你尽快写自己的程序,因为这能让你更快熟悉Awk语言,并能更容易理解大程序。而且遇到问题时,通过实验/实践来得到答案是最好的。你也可以浏览整本书;其中的样例可能会教你如何使用某个特定的语言特性,或者如何写出有趣的程序。
虽然语言特性需要通过例子来介绍,但这样总是不全的。附录A的参考手册里面包含了全部细节,以及更多的样例。在阅读后续章节时,可以随时跳到附录查看这些参考内容。
(第一章完)