Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将AWK输出重定向回输入文件_Awk - Fatal编程技术网

将AWK输出重定向回输入文件

将AWK输出重定向回输入文件,awk,Awk,考虑bash命令,其中file是一个只有一行非空的文件 awk '{print "stuff"}' file >> file 看起来这应该做以下事情:awk读取一行文件,向其中写入“stuff”,然后继续到下一行,在这一点上,它应该再次向文件写入stuff,以此类推到无穷远。但是,它只在写入一次后终止。为什么会这样?这是文件系统、unix管道还是awk的属性?如果可以,您只需要一个更大的文件: $ echo foo > foo $ awk '{print $1}' foo &

考虑bash命令,其中file是一个只有一行非空的文件

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

看起来这应该做以下事情:awk读取一行文件,向其中写入“stuff”,然后继续到下一行,在这一点上,它应该再次向文件写入stuff,以此类推到无穷远。但是,它只在写入一次后终止。为什么会这样?这是文件系统、unix管道还是awk的属性?

如果可以,您只需要一个更大的文件:

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


在本例中使用GNU awk。我假设它(GNU awk)打开文件并读取一个完整的数据块,而不仅仅是一条记录。如果数据量小于或等于一个数据块的大小,则会关闭文件以停止读取。如果还有更多,它会将文件保持打开状态以供读取,直到EOF,并将其追加到文件末尾。

问题太好了!我猜想这与重定向行为有关:AWK读取第一行,在打印第一行时尝试读取第二行,失败,因此只追加第一行。但是,我不确定官方文档是否包含足够的细节来回答这个问题,因为它取决于许多因素(缓冲、求值顺序、并发性等)。这是一个shell问题,它与awk无关(即,无论您使用什么命令而不是awk,它都会有相同的行为),因此,用bash和shell标记您的问题,让shell专家查看它,从而获得“为什么”的确切答案。在第二个示例中,为什么在
awk
执行后foo中有4096*2=8192行以上?awk在稍后读取时不断向文件末尾添加更多记录。实际上,我尝试了
for I in{1..10} ; 不要重复$i;完成>>条
,然后
awk'{print$1}'条>>条;wc-l条形图
。每次我都能得到比上次多一倍的行数。这是正确的(在我上面的假设下)。但是,一旦文件中包含多个fs数据块(例如,我的数据块大小为4096字节),awk将不会在读取第一个数据块后关闭该文件。阈值为4100字节。4101字节是awk永远循环的第一个文件大小。这是1041条记录,我的
用于
循环,第一条记录是11或111,我的块大小为4096。
$ for i in {1..4096} ; do echo $i ; done >> foo
$ awk '{print $1}' foo >> foo
^C
$ wc -l foo
19429617 foo