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.
Réponses
Trop de publicités?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
.
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 !
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 $
.
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.
- Réponses précédentes
- Plus de réponses