考慮bash命令,其中file是具有單個非空行的文件。將AWK輸出重定向回輸入文件
awk '{print "stuff"}' file >> file
看起來這應該做到以下幾點:AWK讀取一行文件,寫道:「東西」給它,然後前進到下一行,在這一點上,它應該寫的東西重新備案,等到無窮遠。但是,它只是在寫完一次後才終止。爲什麼是這樣?這是文件系統的屬性,unix管道還是awk?
考慮bash命令,其中file是具有單個非空行的文件。將AWK輸出重定向回輸入文件
awk '{print "stuff"}' file >> file
看起來這應該做到以下幾點:AWK讀取一行文件,寫道:「東西」給它,然後前進到下一行,在這一點上,它應該寫的東西重新備案,等到無窮遠。但是,它只是在寫完一次後才終止。爲什麼是這樣?這是文件系統的屬性,unix管道還是awk?
它的工作原理,你只需要一個更大的文件:
$ 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並保持文件結尾。
優秀的問題!我的猜測是,這與重定向行爲有關:AWK讀取第一行,嘗試在打印第一行時讀取第二行,失敗,因此只有第一行被追加。然而,我不確定官方文檔包含足夠的細節來回答這個問題,因爲它取決於很多事情(緩衝,評估順序,併發性......) –
這是一個shell問題,它與awk無關即無論您使用的是什麼命令而不是awk,它都會具有相同的行爲),因此使用bash和shell標記您的問題以使shell大師可以查看它,從而獲得「爲什麼」的確切答案。 –