在llinux下,有個tac命令可將文本文件的文本行倒序排列輸出,solaris下沒有這種命令。
得到專家指點,有下列方法可用:
1. 命令方法:
nl filename | sort -nr | cut -f2
這個方法很unix風格,使用多命令組合完成某種功能是典型的unix特點。
2. AWK方法:
awk '{line[NR]=$0}END{for(i=NR;i>0;i--)print line}' filename
這個利用了AWK的數組功能。
3. PERL方法:
perl -e 'print reverse <>' filename
除非你熟悉PERL。
4. SED方法
sed '1!G;h;$!d' filename
這個操作很經典,如果你能看懂這行命令中的sed函數的意義,那對sed就有基本的了解了。
5. VI方法
vi指令 :g/^/m0
這個方法沒有想到,真是簡便實用。
6. shell方法
#!/bin/bash
revread() {
local line
read line || return 0
revread
echo $line
}
revread
利用了shell編程中的函數遞歸。
大家有沒有想過,如果文本行非常多,遞歸層次也將非常多,那麼這個腳本會導致什麼效果?
試過了才知道。與C程序不同,shell腳本的遞歸層次增加,不會導致所謂的“堆棧溢出”,但不斷增加該shell的內存占用量,如果文本行足夠多,可能會耗盡系統可用內存(在系統允許的情況下)。
我們使用遞歸時都知道,遞歸層次應得到有效控制,不能無限增加。這不僅是一個資源消耗問題,也是個運行效率問題。遞歸方法一般只用於遞歸層次非常有限,且代碼用遞歸方法表示時邏輯更清晰的場合。
所以不推薦使用這種方法,這個方法的主要目的是用來演示shell函數遞歸。