compter les lignes dans un fichier compressé

43

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

Vijay
la source
Sans extraire l'archive, vous ne pouvez pas compter les lignes.
Zoli2k

Réponses:

61

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

Mais vous pouvez décompresser dans un flux et compter les nouvelles lignes de ce flux sans jamais écrire le fichier (décompressé) sur le disque. Cela irait quelque chose comme ceci:

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.

MODIFIER

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


la source
7
Sur les unités où gzipest distinct de compress, vous voulez gzcat.
coneslayer
7

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

zgrep -Ec "$" file.gz
Patrick Wright
la source
Cela donne une réponse différente (beaucoup plus élevée) pour moi que la tuyauterie:wc -l
Stop Harming Monica
5

Si vous voulez le faire rapidement, je vous recommande d’utiliser «pigz» (IIRC signifie «Parallel Implementation of GZip»). Je viens de vivre une situation similaire dans laquelle 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 qu'il comptait à partir de lignes alternées, en utilisant 8 processeurs. Ça a fonctionné vite!

peter
la source
1
Ou si unpigz n'est pas disponible, simplement avecfor x in *.fastq.gz; do zcat "$x" | wc -l && echo $x; done
Calimo
2

Utilisez cette commande:

gzgrep -c $ filename.gz

La commande gzgrepse comporte de la même manière grepque sur les fichiers compressés gzip. Il décompresse le fichier à la volée pour la correspondance regex.

Dans ce cas, -cindiquez à la commande de générer le nombre de lignes correspondantes et l'expression régulière $correspondant à la fin de la ligne afin qu'elle corresponde à chaque ligne ou au fichier.

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

Ravi KM
la source
Est-ce gzgrepdisponible sur d'autres systèmes que Solaris?
Pabouk
1
Non, sur d'autres systèmes, la commande serait zgrep -c $ nom_fichier.gz
Ravi KM
1
Bien que l’on puisse penser intuitivement que c’est mieux que zcat + wc, quand je les chronomètre, ils prennent le même temps.
ngọcminh.oss
1

Si vous êtes d'accord avec une estimation approximative plutôt qu'un décompte exact et que l'extraction de l'ensemble du fichier ou sa compression pour les fins de ligne prendrait beaucoup trop de temps (ce qui était mon cas tout à l'heure), vous pouvez:

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

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

James
la source
0

gzip -cd <file.gz> | wc -l

Cela a fonctionné pour moi.

prashanth
la source