本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《 阿里云开发者社区用户服务协议 》和 《 阿里云开发者社区知识产权保护指引 》。如果您发现本社区中有涉嫌抄袭的内容,填写 侵权投诉表单 进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 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
  • 输出结果如下:

    没错,这就是文件的行数,当然,这种统计方法不是linux下最快的,最快的是下面的语句:

  • wc -l arr.dat
  • 输出结果:

  • 15 arr.dat
  • 但也是一种思路。

    第二个问题: 如果有两个print会怎么样呢? 比如:

  • awk '{print $1} {print $2}' arr.dat
  • 输出结果:

    可以看到第二列放到了第一列之后换行显示。如果在print中将$1和$2之间加一个\n是不是也能起到同样的效果呢?

  • awk '{print $1,"\n",$2}' arr.dat
  • 看一下输出结果:

    会发现,第二列前的空白字符也被输出了,两者还是有所区别。