Comment obtenir quelques lignes d'un fichier compressé .gz sans décompresser


89

Comment récupérer les premières lignes d'un fichier gzip? J'ai essayé zcat, mais ça lance une erreur

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

Réponses:


149

zcat(1)peut être fourni par compress(1)ou par gzip(1). Sur votre système, cela semble être compress(1)- il recherche un fichier avec une .Zextension.

Basculez sur gzip -cdà la place de zcatet votre commande devrait fonctionner correctement:

 gzip -cd CONN.20111109.0057.gz | head

Explication

   -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
BTW, si vous êtes assis avec un * .tar.gz, cela vous aidera: tar -xzOf some_huge_file.tar.gz | head
demaniak

Ancien thread mais cela produit un tube cassé avec l'état de sortie 1 avec de gros fichiers gz. Une solution de contournement propre?
kaligne

2
La meilleure solution de contournement que j'ai trouvée jusqu'à présent: utiliser zless file.gz | head. zmorevous laisse toujours avec un tuyau cassé. zlesssemble être la voie à suivre.
kaligne

zless ne quitte pas ... du moins pas sur mon gros fichier. Je cherche toujours un moyen de le faire sans erreurs de tuyau cassé ...
Freek


11

Sur un Mac, vous devez utiliser <avec zcat:

zcat < CONN.20111109.0057.gz|head


2

Si une plage continue de lignes est nécessaire, une option peut être:

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

où les lignes entre les 5e et 10e lignes (toutes deux incluses) de file.gzsont extraites dans un nouveau subFile. Pour les sedoptions, reportez-vous au manuel .

Si chaque, disons, la cinquième ligne est requise:

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

qui extrait la 1ère ligne et saute sur 4 lignes et sélectionne la 5ème ligne et ainsi de suite.


0

Cet extrait de code awk vous permettra d'afficher non seulement les premières lignes, mais également une plage que vous pouvez spécifier. Il ajoutera également les numéros de ligne dont j'avais besoin pour déboguer un message d'erreur pointant vers une certaine ligne dans un fichier gzippé.

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

Voici l'extrait awk utilisé dans la seule ligne ci-dessus. Dans awk NR est une variable intégrée (Nombre d'enregistrements trouvés jusqu'à présent) qui équivaut généralement à un numéro de ligne. les variables from et to sont récupérées depuis la ligne de commande via les options -v.

NR>=from {
   print NR,$0; 
   if (NR>=to) 
     exit 1
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.