Como obter algumas linhas de um arquivo compactado .gz sem descompactar


90

Como obter as primeiras linhas de um arquivo compactado com gzip? Tentei zcat, mas está gerando um erro

zcat CONN.20111109.0057.gz|head
CONN.20111109.0057.gz.Z: A file or directory in the path name does not exist.

Respostas:


151

zcat(1)pode ser fornecido por compress(1)ou por gzip(1). Em seu sistema, parece ser compress(1)- está procurando um arquivo com um.Z extensão.

Mude para gzip -cdno lugar de zcate seu comando deve funcionar bem:

 gzip -cd CONN.20111109.0057.gz | head

Explicação

   -c --stdout --to-stdout
          Write output on standard output; keep original files unchanged.  If there are several input files, the output consists of a sequence of independently compressed members. To obtain better compression, concatenate all input files before compressing
          them.

   -d --decompress --uncompress
          Decompress.

7
Aliás, se você estiver sentado com um * .tar.gz, isso o ajudará: tar -xzOf some_huge_file.tar.gz | head
demaniak

Tópico antigo, mas isso produz um canal quebrado com status de saída 1 com grandes arquivos gz. Qualquer solução alternativa limpa?
Kaligne de

2
A melhor e mais fácil solução que encontrei até agora: use zless file.gz | head. zmoreainda deixa você com o tubo quebrado. zlessparece ser o caminho a percorrer.
Kaligne

zless não sai ... pelo menos não no meu arquivo grande. Ainda estou procurando uma maneira de fazer isso sem erros de cano quebrado ...
Freek


11

Em um mac, você precisa usar o <com zcat:

zcat < CONN.20111109.0057.gz|head


2

Se for necessário um intervalo contínuo de linhas , uma opção pode ser:

gunzip -c file.gz | sed -n '5,10p;11q' > subFile

onde as linhas entre a 5ª e a 10ª linhas (ambas inclusivas) de file.gzsão extraídas em um novo subFile. Para sedopções, consulte o manual .

Se toda, digamos, a 5ª linha for necessária:

gunzip -c file.gz | sed -n '1~5p;6q' > subFile

que extrai a 1ª linha e salta mais de 4 linhas e escolhe a 5ª linha e assim por diante.


0

Este snippet do awk permitirá que você mostre não apenas as primeiras linhas - mas um intervalo que você pode especificar. Ele também adicionará números de linha que eu precisava para depurar uma mensagem de erro apontando para uma determinada linha em um arquivo compactado.

gunzip -c file.gz | awk -v from=10 -v to=20 'NR>=from { print NR,$0; if (NR>=to) exit 1}'

Aqui está o snippet do awk usado no liner acima. No awk, NR é uma variável embutida (Número de registros encontrados até agora) que geralmente é equivalente a um número de linha. as variáveis ​​from e to são obtidas na linha de comando por meio das opções -v.

NR>=from {
   print NR,$0; 
   if (NR>=to) 
     exit 1
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.