数字逆序输出是一个简单而又有趣的问题。例如下面示例中的1,2,3,4,5要按5,4,3,2,1的顺序逆序输出。
root:~ root$ seq 5
1
2
3
4
5
Shell具有强大的文本处理的功能,同时Shell中有很多种方法都可以实现这个要求。下面我们一一来看。
Awk
awk作为Shell中最常用的命令之一,实现起来并不难。其思路在于将每行数组存入一个数组中,然后数组从后往前遍历并依次输出即可。
root:~ root$ seq 5 | awk 'BEGIN{i=0}{arr[i++]=$0} END{for(i=length(arr)-1;i>=0;i--){print arr[i]}}'
5
4
3
2
1
Sed
用awk处理逻辑上简单但是命令有些冗长,用sed就会简洁很多。利用好sed的模式空间和保持空间可以非常简洁优雅的解决很多问题。
用sed的思路在于需要区分第一行和非第一行,如果是第一行只要把数据复制到保持空间,而非第一行先把保持空间的数据追加到模式空间,然后再把模式空间数据复制到保持空间,最后输出最后一行的模式空间即可。光看可能有点难以理解,动手在纸上画一画就明白了。
root:~ root$ seq 5 | sed -n '1h;1!G;1!h;$p'
5
4
3
2
1
sed是优雅而简洁的,那么有没有更简洁的呢? 有
Tac
root:~ root$ seq 5 | tac
5
4
3
2
1