4.15 以逆序形式打印行
这一节的内容很简单。这里讲的东西可能看起来没什么用,不过它可以用来在Bash中模拟栈结构。所以这节还是有些意思的。下面我们要将一个文件中的文本行以逆序形式打印出来。
4.15.1 预备知识
只需要用点awk
的小技巧就能完成这项任务。不过,命令tac
可以直接做到同样的事。这个命令的名称其实就是反过来书写的cat
。
4.15.2 实战演练
先来试试tac
。该命令的语法如下:
- tac file1 file2 ...
它也可以从stdin
中读取:
- $ seq 5 | tac
- 5
- 4
- 3
- 2
- 1
在tac
中,\n
是默认的行分隔符。但我们也可以用 -s
"分隔符"选项指定自己的分隔符。
使用awk
的实现方式如下:
- $ seq 9 | \
- awk '{ lifo[NR]=$0; lno=NR }
- END{ for(;lno>-1;lno--){ print lifo[lno]; }
- }'
在shell脚本中,\
可以很方便地将单行命令分解成多行。
4.15.3 工作原理
这个awk
脚本非常简单。我们将每一行都存入一个关联数组中,用行号作为数组索引(行号由NR
给出),最后由awk
执行END
语句块。为了得到最后一行的行号,在{ }
语句块中使用lno=NR
。因此,这个脚本从最后一行一直迭代到第0行,将存储在数组中的各行以逆序方式打印出来。
4.15.4 参考
4.19节讲解了如何使用awk
编写tac
。