将每行后面都添加一个空行
这是怎么意思呢?一个单行awk命令,其实也是一个用awk语言写的程序,每个awk程序,都是由一系列的“匹配模式 { 执行动作
}”语句所组成的。在这个例子里面,有两个语句,“1”和“{print
""}”。在每个“匹配模式——执行动作”语句中,模式和动作都是可以被省略的。如果匹配模式被省略,那么预定的动作将会对输入文件的每一行执行。如果动
作被省略,那么就默认会执行
动作只有在匹配模式的值为真的时候才会执行。因为“1”永远为真,所以,这个例子也可以写成下面的形式
awk中每条 添加空行的另一种方法
BEGIN是一个特殊的模式,后面所接的内容,会在文件被读入前执行。这里,对ORS变量进行了重新定义,将一个换行符改成了两个。后面的“1”,同样等价于 在每个非空的行后面添加空行
这个语句里面用到了一个新的变量, 在每行后添加两个空行
这一语句与前面的很相似。“1”可以理解为
它首先输出当前行,然后再输出一个换行符以及一个结束print语句的ORS,也就是另外一个换行符。 为每个文件的内容添加行号
这个awk程序在每行的内容前添加了一个变量FNR的输出,并用一个制表符进行分隔。FNR(File Number of Row)这个变量记录了当前行在当前文件中的行数。在处理下一个文件时,这个变量会被重置为0。 为所有文件的所有行统一添加行号
这一句与上一例基本一样,除了使用的行号变量是NR(Number of Row),这个变量不会在处理新文件的时候被重置。所以说,如果你有2个文件,一个10行一个12行,那这个变量会从1一直变到22。 用更漂亮的样式添加行号
这个例子用了printf函数来自定义输出样式,它所接受的参数与标准C语言的printf函数基本一致。需要注意的是,printf后不会被自动添加ORS,所以你需要自己指定换行。这个语句指定了行号会右对齐,然后是一个空格和冒号,接着是当前行的内容。 为文件中的非空行添加行号
Awk的变量都是自动定义的:你第一次用到某个变量的时候它就自动被定义了。这个语句在每次遇到一个非空行的时候先把一个变量a加1,然后把a的数值添加到行首,然后输出当前行的内容。 计算文件行数(模拟 wc -l)
END是另外一个不会被检验是否为真的模式,后面的动作会在整个文件被读完后进行。这里是输出最终的行号,即文件的总行数。 对每行求和
Awk有些类似C语言的语法,比如这里的 对所有行所有字段求和
这个例子与上一个基本一致,除了输出的是所有行所有字段的和。由于变量会被自动定义,s只需要定义一次,故而不需要把s定义成0。另外需要注意的是,它输出 将所有字段替换为其绝对值
这条语句用了C语言的另外两个特性,一个是 下面的是将这条语句完整的写出来的形式。print语句会在行中所有字段被改为正数后执行。
计算文件中的总字段(单词)数
这个命令匹配所有的行,并不断的把行中的字段数累加到变量total。执行完成上述动作后,输出total的数值。 输出含有单词Beth的行的数目
这个例子含有两个语句。第一句找出匹配/Beth/的行,并对变量n进行累加。在/.../之间的内容为正则表达式,/Beth/匹配所有含有 “Beth”的单词(它不仅匹配Beth,同样也匹配Bethe)。第二句在文件处理完成后输出n的数值。这里用n+0是为了让n为0 的情况下输出0而不是一个空行。 寻找第一个字段为数字且最大的行
这个例子用变量max记录第一个字段的最大值,并把第一个字段最大的行的内容存在变量maxline中。在循环终止后,输出max和maxline的内容。注意:如果在数字都为负数的情况下,这个例子就不能用了,下面的是修改过的版本
在每一行前添加输出该行的字段数
这个例子仅仅是在逐行输出字段数NF,一个冒号,以及该行的内容。 输出每行的最后一个字段
awk里面的字段可以用变量的形式引用。这一句输出第NF个字段的内容,而NF就是该行的字段数。 打印最后一行的最后一个字段
这个例子用field记录最后一个字段的内容,并在循环后输出field的内容。 这里是一个更好的版本。它更常用、更简洁也更高效:
输出所有字段数大于4的行
这个例子省略了要执行的动作。如前所述,省略动作等价于 输出所有最后一个字段大于4的行
这个例子用$NF引用最后一个字段,如果它的数值大于4,那么就输出。 |
|