好吧所以這裏尾我與這個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行,有什麼建議嗎?
好吧所以這裏尾我與這個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行,有什麼建議嗎?
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
的情況。
當我嘗試將文本文件轉換爲awk時,我仍然在ARGV [1 ] ------------------------------------------------ ----------- cat test1.txt | awk -f tailawk 10 – 2012-02-01 18:46:23
認爲我已經添加了一個BEGIN {num = ARGV [1]} – 2012-02-01 18:47:33
您需要將-v num=10
添加到awk命令行以設置值num
。在你的最終循環中從NR-num+1
開始,否則你將以num+1
行輸出結束。
是thx我忘了增加nr-num,因爲我試過從nr向後讀取nr-num並交換索引和忘記增加,thx無論如何 – 2012-02-01 19:45:09
這可能會爲你工作:
awk '{a=a b $0;b=RS;if(NR<=v)next;a=substr(a,index(a,RS)+1)}END{print a}' v=10
如果解釋了我會贊成這個。我能理解它,但它需要每個人的解釋。 – Camusensei 2015-09-23 11:22:32
所有這些答案的存儲整個源文件。這是一個可怕的想法,並會打破更大的文件。
這裏僅存儲的行數的快速方式輸出(注意,更高效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 …
必須與線九點前空行「富」)。
'awk -f tail.awk num = 10',10本身將被解釋爲文件名。祝你好運。 – shellter 2012-02-01 18:45:51
你真的需要存儲整個文件嗎? – Johnsyweb 2012-02-01 18:56:35
@Johnsyweb好吧,但這是我想用的方法,還有一些其他的想法?免費下載:) – 2012-02-01 19:46:07