Tamanho do buffer do awk

1

Eu observei este interessante conjunto de comandos hoje:

$ 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

Minha primeira pergunta foi por que estou recebendo vários 6 ao invés de apenas um, mas então eu lembrei que você precisa fechar cada vez:

awk '{print 6 > ARGV[1]; close(ARGV[1])} 1' alfa.txt

No entanto, o que também me intriga é se eu estou espantando a entrada do próprio começando, como posso continuar lendo o arquivo inteiro? Meu palpite é que Awk está realmente escrevendo para um buffer, então escrevendo para o arquivo real em o fim ou talvez toda vez que o buffer for preenchido.

Se o último for verdadeiro, qual é o tamanho do buffer?

    
por Steven Penny 18.08.2018 / 16:46

2 respostas

0

Pelo menos no meu sistema, parece ser 32768 de um arquivo e 65536 de um tubo:

$ 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
    
por 18.08.2018 / 18:04
1

Depende da implementação, mas você está vendo o awk abrir o arquivo de saída depois de abrir sua entrada. O arquivo de entrada original é perdido, exceto pelo descritor de arquivo aberto do awk que ele lê.

Isso não é apenas o awk que poderia fazer isso: é comum a muitos aplicativos ...

p.s: o buffer é o seu disco (tamanho não determinável da questão).

    
por 18.08.2018 / 17:11