2017-08-03 165 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