AWK语言第二版 1.8有用的一句话程序 1.9接下来呢

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的参考手册里面包含了全部细节,以及更多的样例。在阅读后续章节时,可以随时跳到附录查看这些参考内容。

(第一章完)

你可能感兴趣的:(AWK,linux,开发语言)