Depois de mais googling, encontrei esta pergunta: Altere o cabeçalho em um arquivo enorme sem reescrevendo o arquivo inteiro .
Para evitar ter que reescrever o arquivo inteiro ao adicionar no cabeçalho, imprimi um cabeçalho fictício de uma quantidade mínima de bytes (preenchendo com zeros) ao criar o arquivo:
awk 'NR==1{print "dummyhead100\tdummyhead20000"; next} $3==1 {print
$1"\t"$2}' input > output
Eu então faço um arquivo (ou variável string) com o novo cabeçalho como header.tsv, e substituo o cabeçalho fictício no local (depois de ter certeza que os cabeçalhos fictícios e novos são o mesmo número de bytes) usando dd
:
dd conv=notrunc obs=1 if=header.tsv of=output
Dessa forma, output
é editado no local e não preciso esperar que o arquivo inteiro seja copiado ou tenha que mantê-lo na memória.