2012-02-01 47 views
3

好吧所以這裏尾我與這個AWK代碼至極掙扎應該效仿tail命令實現與AWK

num=$1; 
{ 
    vect[NR]=$0; 

} 
END{ 
    for(i=NR-num;i<=NR;i++) 
      print vect[$i] 
} 

所以我想在這裏實現是AWK 例如模擬的tail命令考慮cat somefile | awk -f tail.awk 10 應該打印文本文件的最後10行,有什麼建議嗎?

+1

'awk -f tail.awk num = 10',10本身將被解釋爲文件名。祝你好運。 – shellter 2012-02-01 18:45:51

+0

你真的需要存儲整個文件嗎? – Johnsyweb 2012-02-01 18:56:35

+0

@Johnsyweb好吧,但這是我想用的方法,還有一些其他的想法?免費下載:) – 2012-02-01 19:46:07

回答

5
for(i=NR-num;i<=NR;i++) 
    print vect[$i] 

$表示位置參數。使用只是普通i

for(i=NR-num;i<=NR;i++) 
    print vect[i] 

爲我工作的完整代碼是:

#!/usr/bin/awk -f 
BEGIN{ 
     num=ARGV[1]; 
     # Make that arg empty so awk doesn't interpret it as a file name. 
     ARGV[1] = ""; 
} 
{ 
     vect[NR]=$0; 
} 
END{ 
     for(i=NR-num;i<=NR;i++) 
       print vect[i] 
} 

你應該有些代碼可能添加到END處理時NR < num的情況。

+0

當我嘗試將文本文件轉換爲awk時,我仍然在ARGV [1 ] ------------------------------------------------ ----------- cat test1.txt | awk -f tailawk 10 – 2012-02-01 18:46:23

+0

認爲我已經添加了一個BEGIN {num = ARGV [1]} – 2012-02-01 18:47:33

2

您需要將-v num=10添加到awk命令行以設置值num。在你的最終循環中從NR-num+1開始,否則你將以num+1行輸出結束。

+0

是thx我忘了增加nr-num,因爲我試過從nr向後讀取nr-num並交換索引和忘記增加,thx無論如何 – 2012-02-01 19:45:09

2

這可能會爲你工作:

awk '{a=a b $0;b=RS;if(NR<=v)next;a=substr(a,index(a,RS)+1)}END{print a}' v=10 
+1

如果解釋了我會贊成這個。我能理解它,但它需要每個人的解釋。 – Camusensei 2015-09-23 11:22:32

3

所有這些答案的存儲整個源文件。這是一個可怕的想法,並會打破更大的文件。

這裏僅存儲的行數的快速方式輸出(注意,更高效tail總是會更快,因爲它不讀取整個源文件!):

awk -vt=10 '{o[NR%t]=$0}END{i=(NR<t?0:NR);do print o[++i%t];while(i%t!=NR%t)}' 

更多清晰(並且具有較少code golf):的易讀代碼

awk -v tail=10 ' 
    { 
    output[NR % tail] = $0 
    } 
    END { 
    if(NR < tail) { 
     i = 0 
    } else { 
     i = NR 
    } 
    do { 
     i = (i + 1) % tail; 
     print output[i] 
    } while (i != NR % tail) 
    }' 

說明:

這使用modulo operator到只存儲所需數量的項目(tail變量)。由於每行都被解析,所以它被存儲在較舊的數組值的上面(所以第11行被存儲在output[1]中)。

END節將增量變量i設置爲零(如果我們得到的數量少於所需的行數)或者行數,它告訴我們從哪裏開始調用已保存的行。然後我們按順序打印保存的行。當我們返回到第一個值時(在我們打印完它之後),循環結束。

,可隨時更換if/else節(或在我的golfed例如ternary clause)只i = NR如果你不關心讓空行,以填補請求數量(echo "foo" |awk -vt=10 …必須與線九點前空行「富」)。