2016-04-03 53 views
2

我需要一個腳本來打印文本文件的最後n行的最後n行。文本文件名和行數可以變化,我只想調用腳本來打印最後n行的任何文本文件。我知道前n行我可以使用NR < n;打印,但我怎麼能做到這一點的最後n行作爲行數可以varied.-感謝使用awk腳本,以打印文本文件

+0

的[實現與awk的尾巴(http://stackoverflow.com/questions/9101296/implement-tail-with-awk) – tripleee

回答

2

有正是出於這個目的的UNIX工具,叫做tail。要獲得文件的最後100行,您可以使用tail -n 100 file,然後直接使用輸出或將其傳送到其他程序(如awk)。

+0

是的,我知道的尾巴,但我不知道怎麼寫,在以股代息可能的複製牛逼!對不起,我在awk中是如此的新鮮! – Sajjad

+0

@Sajjad如果你真的需要裏面的awk尾巴的功能,例如參見http://stackoverflow.com/questions/9101296/implement-tail-with-awk –

0

要做到這一點本身在awk中,你要記住以線條爲你看到他們:

awk -v n=10 ' 
    {line[NR]=$0} 
    END {for (i=NR-(n-1); i<=NR; i++) print line[i]} 
' file 

爲了節省內存,我們並不需要記住整個文件;使用

{line[NR]=$0; if (NR>n) delete line[NR-n]} 

然而,它是簡單的扭轉文件,打印第一 n行,並重新反向輸出

tac file | awk -v n=10 'NR <= n' | tac 

但使用tail要簡單得多,所有這

1

作爲練習,還有另外一個版本的交易空間與時間來達到同樣的

$ awk -v n=10 'NR==FNR{a=NR;next} FNR>(a-n)' file{,} 

先掃描文件得到的行數,並使用第二次篩選最後n行。

0

給這個腳本一試:

{ 
    lines[(i=(++i%n))]=$0; 
} 
END { 
    if (NR>=n) { 
    linessize=n; 
    } else { 
    linessize=NR; 
    i=0; 
    } 
    for(j=1;j<=linessize;j++) { 
    print lines[(i+j)%n]; 
    } 
} 

文件進行解析只有一次。

n元素只有用於緩衝讀取的行。

測試:

$ printf "one line\n2nd line\n" | ./tail-awk.awk -f script.awk -v n=10 
one line 
2nd line 
$ ./tail-awk.awk -f script.awk -v n=10 <(man bash) 
     attempted. When a process is stopped, the shell immediately executes the next command in the sequence. It suffices to 
     place the sequence of commands between parentheses to force it into a subshell, which may be stopped as a unit. 

     Array variables may not (yet) be exported. 

     There may be only one active coprocess at a time. 



GNU Bash-4.1           2009 December 29             BASH(1) 
$ ./tail-awk.awk -f script.awk -v n=5 /etc/apt/sources.list 

deb http://archive.debian.org/debian-archive hamm main 

deb ftp://ftp.debian.org/debian squeeze contrib 

$ 
+0

感謝。有效。我怎樣才能編輯,通過使用這個'awk -f script.awk file.txt' – Sajjad

+0

@Sajjad這個答案已被更新。 –

+0

@Sajjad答案已經更新(再次) –

1
$ cat file 
1 
2 
3 
4 

$ cat tst.awk 
{ rec[NR % n] = $0 } 
END { 
    for (i=NR+1+(n<NR?0:n-NR); i<=(NR+n); i++) { 
     print rec[i % n] 
    } 
} 

$ awk -v n=2 -f tst.awk file 
3 
4 

設定時的i起始值是,以適應需要你問打印更多的記錄情況下比存在的文件中,複雜如:

$ awk -v n=6 -f tst.awk file 
1 
2 
3 
4