2016-09-24 17 views
1

我有一個簡單的文件,這是我的awk腳本處理:AWK:印刷線後,他們已經處理過的

AAAAA BBBBBB 
CCCCC DDDDDD 
EEEEE FFFFFF 
GGGGG HHHHHH 
IIIII JJJJJJ 

首先,我想打印出來的最後幾行之一,所以我開始

#!/usr/bin/awk 
{if (NR==5){print $0;}} 

因此得到IIIII JJJJJJ

現在我想打印第5行後打印第2行。所以,我改變我的腳本是:

#!/usr/bin/awk 
{if (NR==5){print $0; NR=2;} 
if (NR==2){print $0;} 

但在這種情況下,它是一個永無止境的循環。我怎麼能先打印第5行,然後打印第2行而不打印第5行?

預期輸出清晰度:

IIIII JJJJJJ 
CCCCC DDDDDD 
+1

在最後的腳本中沒有永無止境的循環。設置'NR = 2'不告訴awk重新開始讀取第2行的輸入,它只是將變量'NR'設置爲值'2',直到讀取下一行,第6行,此時'NR '變成'6'。此外,您還缺少基本的awk條件{action}語法 - awk不是C.請閱讀Arnold Robbins編寫的Effective Awk Programming第4版。 –

回答

5

如何:

awk '{if (NR==2){x=$0} else if (NR==5) {y=$0}} END {print y; print x}' input 

當我們掃描的文件中的行由行,我們存儲我們感興趣的一些變量線,然後我們在最後打印它們。

而且這裏有一個輕微的簡單的選擇:

awk '{if (NR==2){x=$0} else if (NR==5) {print $0; print x}}' input 

此只存儲第2行中的變量。當我們到達第5行時,我們打印它,然後從變量打印第2行。

編輯:作爲威廉Pursell指出,寫上面的代碼的更慣用的方式將是

awk 'NR==2 {x=$0} NR==5 {y=$0} END {print y; print x}' input 

awk 'NR==2 {x=$0} NR==5 {print $0; print x}' input 
+0

哦,你使用變量。這將做到這一點。謝謝 –

+1

更習慣做'awk'NR == 2 {x = $ 0} NR == 5 {print $ 0;打印x; }' –

+0

@WilliamPursell你是對的,我只提供了一個讓OP更容易理解的答案。 – redneb

2

通過反轉輸入文件備用溶液(線明智) ..需要知道輸入文件中的行數,並相應地調整NR

$ tac ip.txt | awk 'NR==1 || NR==4' 
IIIII JJJJJJ 
CCCCC DDDDDD