56 votes

compter les lignes dans un fichier compressé

Si j'ai un fichier .gz sur unix qui a un certain nombre de lignes. Comment pourrais-je compter les lignes sur unix sans le décompresser.

78voto

Vous ne pouvez évidemment pas compter les nouvelles lignes si le fichier est encore compressé.

Mais vous pouvez décompresser vers un flux, et compter les nouvelles lignes dans ce flux, sans jamais écrire le fichier (décompressé) sur le disque. Cela donnerait quelque chose comme ça :

zcat file.gz | wc -l

zcat pour decompress & cat, wc pour wordcount. Voir les pages de manuel pour les deux si vous voulez en savoir plus.

EDITAR

Si vous n'avez pas zcat, zcat est juste un autre nom pour gunzip -c .

10voto

Vitali Climenco Points 347

Cela semble également fonctionner - grep pour le nombre de fins de lignes dans le fichier.

zgrep -Ec "$" file.gz

7voto

peter Points 71

Si vous voulez le faire rapidement, je vous recommande d'utiliser 'pigz' (qui, je crois, signifie "Parallel Implementation of GZip"). Je viens d'avoir une situation similaire où je voulais compter le nombre de lignes dans un tas de fichiers gzipés et voici ma solution :

for x in *.gz; do unpigz -p 8 -c $x | wc -l && echo $x; done

Ce qui m'a donné le nombre de lignes et le fichier à partir duquel il a compté sur des lignes alternées, en utilisant 8 processeurs. Cela a fonctionné rapidement !

3voto

Ravi K M Points 31

Utilisez cette commande :

gzgrep -c $ filename.gz

La commande gzgrep se comporte de la même manière que grep mais sur les fichiers compressés par gzip. Il décompresse le fichier à la volée pour la correspondance regex.

Dans ce cas -c demande à la commande d'afficher le nombre de lignes correspondantes et la regex. $ correspond à la fin de la ligne, de sorte qu'il correspond à chaque ligne du fichier.

Le résultat final est identique à gzip -dc filename.gz | grep -c $ .

2voto

James Points 141

Si vous êtes d'accord avec une estimation approximative plutôt qu'un compte exact, et que l'extraction du fichier entier ou le zgrepping pour les fins de ligne prendrait beaucoup trop de temps (ce qui était ma situation à l'instant), vous pouvez le faire :

zcat "$file" | head -1000 > 1000-line-sample.txt
ls -ls 1000-line-sample.txt "$file"

alors le nombre approximatif de lignes est 1000 * (size of $file) / (size of 1000-line-sample) pour autant que vos données soient assez homogènes par ligne.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X