考虑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大师可以查看它,从而获得“为什么”的确切答案。 –