awk的输出总共只有两个东东,一个是print指令,一个是printf函数。
显示文件的行号
我们还是以上一篇的arr.dat文件来测试。
- awk '{print NR,$0}' arr.dat
在awk中有很多的内置的变量,NR就是其中之一,表示的是当前的行号。上面的语句就可以解释成:逐行输出,并在其前输出行号。看一下输出结果:
- 1 1034 7:26
- 2 1025 7:27
- 3 1101 7:32
- 4 1006 7:45
- 5 1012 7:46
- 6 1028 7:49
- 7 1051 7:51
- 8 1029 7:57
- 9 1042 7:59
- 10 1008 8:01
- 11 1052 8:05
- 12 1005 8:12
- 13 1005 8:13
- 14 1005 8:13
- 15 1005 8:13
行号后面会有一个字白字符与第二列进行分隔。这个空白字符是awk默认的,当然也可以进行修改。
上面的输出格式很不好看呀,随着行号数字位数的增多,格式开始变形。第一个问题来了,怎么让行号右对齐?
- awk '{printf("%5d %s\n", NR, $0)}' arr.dat
我们终于用到了printf函数,这跟C语言的好像没什么不同。%5d表示输出一个5位的整数,如果不足5位,以空白填充,%s表示输出一个字符串。上面的程序的意思就是逐行输出文件内容,并在每行的第一列前追加行号,行号不足5位时以空白填充,一行结束后,以\n换行。
注意,在%5d和%s之间有一个空字符,如果没有的话,行号就会与第1列挨着,很不好看呀。我们看一下输出结果:
- 1 1034 7:26
- 2 1025 7:27
- 3 1101 7:32
- 4 1006 7:45
- 5 1012 7:46
- 6 1028 7:49
- 7 1051 7:51
- 8 1029 7:57
- 9 1042 7:59
- 10 1008 8:01
- 11 1052 8:05
- 12 1005 8:12
- 13 1005 8:13
- 14 1005 8:13
- 15 1005 8:13
当然,我们也可以将这个空字符换成别的,比如\t:
- awk '{printf("%5d\t%s\n", NR, $0)}' arr.dat
输出就成了:
- 1 1034 7:26
- 2 1025 7:27
- 3 1101 7:32
- 4 1006 7:45
- 5 1012 7:46
- 6 1028 7:49
- 7 1051 7:51
- 8 1029 7:57
- 9 1042 7:59
- 10 1008 8:01
- 11 1052 8:05
- 12 1005 8:12
- 13 1005 8:13
- 14 1005 8:13
- 15 1005 8:13
在这个问题的基础上,我们可以有另外一个收获。看一下下面的程序:
- awk 'END {print NR}' arr.dat
输出结果如下:
- 15
没错,这就是文件的行数,当然,这种统计方法不是linux下最快的,最快的是下面的语句:
- wc -l arr.dat
输出结果:
- 15 arr.dat
但也是一种思路。
第二个问题:如果有两个print会怎么样呢?比如:
- awk '{print $1} {print $2}' arr.dat
输出结果:
- 1034
- 7:26
- 1025
- 7:27
- 1101
- 7:32
- 1006
- 7:45
- 1012
- 7:46
- 1028
- 7:49
- 1051
- 7:51
- 1029
- 7:57
- 1042
- 7:59
- 1008
- 8:01
- 1052
- 8:05
- 1005
- 8:12
- 1005
- 8:13
- 1005
- 8:13
- 1005
- 8:13
可以看到第二列放到了第一列之后换行显示。如果在print中将$1和$2之间加一个\n是不是也能起到同样的效果呢?
- awk '{print $1,"\n",$2}' arr.dat
看一下输出结果:
- 1034
- 7:26
- 1025
- 7:27
- 1101
- 7:32
- 1006
- 7:45
- 1012
- 7:46
- 1028
- 7:49
- 1051
- 7:51
- 1029
- 7:57
- 1042
- 7:59
- 1008
- 8:01
- 1052
- 8:05
- 1005
- 8:12
- 1005
- 8:13
- 1005
- 8:13
- 1005
- 8:13
会发现,第二列前的空白字符也被输出了,两者还是有所区别。
本文转自 ustb80 51CTO博客,原文链接:http://blog.51cto.com/ustb80/1033387,如需转载请自行联系原作者