我今天注意到了这组有趣的命令:
$ seq 5 > alfa.txt
$ awk '{print 6 > ARGV[1]} 1' alfa.txt
1
2
3
4
5
$ cat alfa.txt
6
6
6
6
6
我的第一个问题是为什么我得到几个6
而不是一个,但后来我记得你每次都需要关闭:
awk '{print 6 > ARGV[1]; close(ARGV[1])} 1' alfa.txt
然而,让我感到困惑的是,如果我从一开始就破坏输入,我怎么能仍然通过并阅读整个文件?我的猜测是,Awk 实际上是在写入缓冲区,然后在最后或者每次缓冲区填满时写入实际文件。
如果后者为真,那么缓冲区大小是多少?
它依赖于实现,但您会看到 awk 在打开其输入后打开输出文件。原始输入文件丢失,除了它读取的 awk 的打开文件描述符。
这不仅仅是 awk 可以做到这一点:它对许多应用程序都很常见......
ps:缓冲区是您的磁盘(大小无法从问题中确定)。
至少在我的系统上,它似乎是来自文件的 32768 和来自管道的 65536: