我今天注意到这组有趣的命令:
$ 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 实际上正在写入缓冲区,然后在最后或可能每次缓冲区填满时写入实际文件。
如果后者为真,则缓冲区大小是多少?
答案1
它依赖于实现,但是您会看到 awk 在打开其输入后打开输出文件。原始输入文件丢失,除了 awk 读取的打开文件描述符之外。
这不仅仅是 awk 可以做到这一点:它对于许多应用程序来说都很常见......
ps:缓冲区是您的磁盘(无法从问题中确定大小)。
答案2
至少在我的系统上,它似乎是来自文件的 32768,以及来自管道的 65536:
$ yes | head -100000 | tee file > pipe
$ awk '{print "n" > ARGV[1]}' file
$ sed s/y/n/ pipe | awk 'BEGIN {while (getline < "-") print > ARGV[1]}' pipe
$ wc -l file pipe
32768 file
65536 pipe