Como anexar uma linha em um arquivo zipado sem descompactar?

5
mknod /tmp/oracle.pipe p

sqlplus / as sysdba << _EOF
set escape on

host nohup gzip -c < /tmp/oracle.pipe > /tmp/out1.gz \&
spool /tmp/oracle.pipe
select * from employee;
spool off

_EOF

rm /tmp/oracle.pip

Eu preciso inserir um trailer no final do arquivo zipado out1.gz, Eu posso contar as linhas usando

count=zcat out1.gz |wc -l

Como faço para inserir o trailer

T5 (assuming count=5)

No final de out1.gz sem descompactá-lo.

    
por Rishi Deorukhkar 22.02.2016 / 10:23

2 respostas

14

A partir de man gzip , você pode ler que gzip ped arquivos podem ser simplesmente concatenados:

ADVANCED USAGE Multiple compressed files can be concatenated. In this case, gunzip will extract all members at once. For example:

        gzip -c file1  > foo.gz
        gzip -c file2 >> foo.gz

  Then

        gunzip -c foo

  is equivalent to

         cat file1 file2

Isso também pode ser feito usando cat para os arquivos gzip ped, por exemplo:

seq 1 4 > A && gzip A
echo 5 > B && gzip B
#now 1 to 4 is in A.gz and 5 in B.gz, we want 1 to 5 in C.gz:
cat A.gz B.gz > C.gz && zcat C.gz
1
2
3
4
5
#or for appending B.gz to A.gz:
cat B.gz >> A.gz

Para fazer isso sem o arquivo externo da linha a ser anexada, faça o seguinte:

echo "this is the new line" | gzip - | cat - >> original_file.gz
    
por 22.02.2016 / 10:32
2

Qual é o tamanho da mesa do seu empregado? A menos que você tenha um milhão de funcionários e cada registro leve milhares de bytes, provavelmente nem vale a pena comprimir a saída.

Quase certamente não vale a pena comprimir isso porque o arquivo de saída está sendo criado - então, por que não apenas imprimir em texto puro descompactado, rodar count=$(wc -l out1) ; echo "T$count" >> out1 , e depois compactar com gzip out1 ?

como alternativa, basta executar uma variação de select count(*) from employee antes do comando spool off .

    
por 22.02.2016 / 10:37

Tags