2013-04-06 120 views
16

我正在學習awk/gawk。所以最近我只是試圖解決它的任何問題,以獲得更多的實踐機會。用awk從文件中刪除第一行和最後一行的最簡單方法是什麼?

我的同事昨天問了一個問題,

「如何從文件中刪除第一和最後一行的」

。我知道sed '1d;$d' file會工作。即使表現不佳,也是head/tail作品。我告訴他sed,他很高興。

後來,我試圖寫一個awk一行代碼:到目前爲止,我得到的是:

awk 'NR>1{a[++k]=$0}END{for(i=1;i<k;i++)print a[i]}' 

這將存儲在陣列整個文件只跳過最後一行。我覺得應該有這樣做更容易(或更好)的方式..

(如果沒有更容易或更快,更好的方式,我會刪除這個問題)

謝謝。

回答

40

這是卓有成效:

awk 'NR>2 {print last} {last=$0}' 

awk執行動作print last只有當NR> 2(即,所有線路上但所述第一2)。在所有行中,它將變量last設置爲當前行。所以當awk讀取第三行時,它會打印第2行(存儲在last中)。當它讀取最後一行(第n行)時,它會打印第n-1行的內容。最終效果是打印第2行至第n-1行。

+1

是的!!!我雖然也是這樣,但是給了'NR> 1',然後放棄了...... urrrr。根本沒有想到NR> 2,多麼愚蠢!太棒了!謝謝!向上! – Imagination 2013-04-06 22:36:39

+0

需要稍等幾分鐘才能標記爲接受.... – Imagination 2013-04-06 22:37:34

+0

心靈解釋魔法位更詳細? – eMPee584 2013-08-10 23:22:34

5

讓我建議另一種解決方案。 在情況下,如果你需要定製的N代表頂部和底部的線就可以使用命令:

awk '{print $1}' | head -n -1 | tail -n+2 

頭-n -1 - 刪除最後一行

尾巴 - n + 2 - 從第二行開始輸出(刪除1行)

以下命令將從上面和下面刪除3行:

awk '{print $1}' | head -n -3 | tail -n +4 

實際上,我們甚至不需要AWK這裏:

more | head -n -1 | tail -n +2 

cat | head -n -1 | tail -n +2 

感謝Igor Fobia發表評論!

+2

中的'雙文件處理'我喜歡這個解決方案,但現在awk是多餘的。你只需要做更多的文件名頭-n -1 |尾巴-n + 2「 – 2015-12-16 10:10:48

相關問題