2017-08-03 166 views
1

考慮bash命令,其中file是具有單個非空行的文件。將AWK輸出重定向回輸入文件

awk '{print "stuff"}' file >> file 

看起來這應該做到以下幾點:AWK讀取一行文件,寫道:「東西」給它,然後前進到下一行,在這一點上,它應該寫的東西重新備案,等到無窮遠。但是,它只是在寫完一次後才終止。爲什麼是這樣?這是文件系統的屬性,unix管道還是awk?

+0

優秀的問題!我的猜測是,這與重定向行爲有關:AWK讀取第一行,嘗試在打印第一行時讀取第二行,失敗,因此只有第一行被追加。然而,我不確定官方文檔包含足夠的細節來回答這個問題,因爲它取決於很多事情(緩衝,評估順序,併發性......) –

+0

這是一個shell問題,它與awk無關即無論您使用的是什麼命令而不是awk,它都會具有相同的行爲),因此使用bash和shell標記您的問題以使shell大師可以查看它,從而獲得「爲什麼」的確切答案。 –

回答

1

它的工作原理,你只需要一個更大的文件:

$ echo foo > foo 
$ awk '{print $1}' foo >> foo 
$ wc -l foo 
2 foo 

但是:

$ for i in {1..4096} ; do echo $i ; done >> foo 
$ awk '{print $1}' foo >> foo 
^C 
$ wc -l foo 
19429617 foo 

在這個例子中使用GNU awk的。我假設它(GNU awk)打開文件並讀取一個完整的數據塊,而不僅僅是一條記錄。如果小於或等於一個數據塊數據量的大小,它會從閱讀中關閉文件。如果有更多的文件,它會保持打開文件直到EOF並保持文件結尾。

+0

Hi @jmaes,在第二個例子中,爲什麼'awk'執行後,foo中有超過4096 * 2 = 8192行? – CWLiu

+0

Awk不斷在文件末尾添加更多記錄,稍後再閱讀。 –

+0

其實我在{1..10}試過'因爲我;做echo $ i;完成>> bar',然後'awk'{print $ 1}'bar >> bar; wc -l bar「。每次我都能得到比上一次更多的線數。 – CWLiu