4.15 以逆序形式打印行

这一节的内容很简单。这里讲的东西可能看起来没什么用,不过它可以用来在Bash中模拟栈结构。所以这节还是有些意思的。下面我们要将一个文件中的文本行以逆序形式打印出来。

4.15.1 预备知识

只需要用点awk的小技巧就能完成这项任务。不过,命令tac可以直接做到同样的事。这个命令的名称其实就是反过来书写的cat

4.15.2 实战演练

先来试试tac。该命令的语法如下:

  1. tac file1 file2 ...

它也可以从stdin中读取:

  1. $ seq 5 | tac
  2. 5
  3. 4
  4. 3
  5. 2
  6. 1

tac中,\n是默认的行分隔符。但我们也可以用 -s "分隔符"选项指定自己的分隔符。

使用awk的实现方式如下:

  1. $ seq 9 | \
  2. awk '{ lifo[NR]=$0; lno=NR }
  3. END{ for(;lno>-1;lno--){ print lifo[lno]; }
  4. }'

在shell脚本中,\ 可以很方便地将单行命令分解成多行。

4.15.3 工作原理

这个awk脚本非常简单。我们将每一行都存入一个关联数组中,用行号作为数组索引(行号由NR给出),最后由awk执行END语句块。为了得到最后一行的行号,在{ }语句块中使用lno=NR。因此,这个脚本从最后一行一直迭代到第0行,将存储在数组中的各行以逆序方式打印出来。

4.15.4 参考

4.19节讲解了如何使用awk编写tac