2010-07-27 12 views
11

J'essaye de chercher une certaine chaîne dans beaucoup de fichiers csv gzipés, la chaîne se trouve à la première rangée et je pensais obtenir la première ligne de chaque fichier en combinant find, zcat et head. Mais je ne peux pas les amener à travailler ensemble.trouver des résultats redirigés vers zcat puis vers la tête

$find . -name "*.gz" -print | xargs zcat -f | head -1 
20051114083300,1070074.00,0.00000000 
xargs: zcat: terminated by signal 13 

example file: 
$zcat 113.gz | head 
20050629171845,1069335.50,-1.00000000 
20050629171930,1069315.00,-1.00000000 
20050629172015,1069382.50,-1.00000000 
.. and 2 milion rows like these ... 

Bien que je résolu le problème en écrivant un script bash, itérer sur les fichiers et l'écriture dans un fichier temporaire, il serait bon de savoir ce que je fait de mal, comment le faire, et s'il pourrait y avoir d'autres façons de s'y prendre.

Répondre

7

Vous devriez trouver que cela fonctionne:

find . -name "*.gz" | while read -r file; do zcat -f "$file" | head -n 1; done 
+0

a fonctionné parfaitement, merci. Je ne savais pas que vous pourriez utiliser et lire comme ça, je m'en souviendrai. – furedde

+0

Vous pouvez également utiliser: 'for f in * .gz; fais zcat $ f | tête -n 1; done' – arekolek

+0

@arekolek: Ce qui n'est pas récursif sauf si vous utilisez 'shopt -s globstar; pour f dans **/*. gz', alors que 'find' est récursif sauf si vous le limitez avec' -maxdepth'. –

0
zcat -r * 2>/dev/null | awk -vRS= -vFS="\n" '{print $1}' 
3

Cela a fonctionné comme vous le demandiez.

head fait son travail, a imprimé une ligne et a quitté. zcat alors fonctionnant sous les auspices de xargs a essayé d'écrire à un tuyau fermé et a reçu un SIGPIPE fatal pour ses efforts. Après la mort de son enfant, Xargs a signalé le pourquoi.

Pour obtenir le comportement souhaité, vous devez construire find -exec ... ou zhead pour donner à xargs.

ajouté junk code je trouve derrière le réfrigérateur:

#!/usr/bin/python 

"""zhead - poor man's zcat file... | head -n 
    no argument error checking, prefers to continue in the face of 
    IO errors, with diagnostic to stderr 

    sample usage: find ... | xargs zhead.py -1""" 

import gzip 
import sys 

if sys.argv[1].startswith('-'): 
    nlines = int(sys.argv[1][1:]) 
    start = 2 
else: 
    nlines = 10 
    start = 1 

for zfile in sys.argv[start:]: 
    try: 
     zin = gzip.open(zfile) 
     for i in range(nlines): 
      line = zin.readline() 
      if not line: 
       break 
      print line, 
    except Exception as err: 
     print >> sys.stderr, zfile, err 
    finally: 
     try: 
      zin.close() 
     except: 
      pass 

Elle a traité 10k fichiers dans/usr/share/man dans environ une minute.

+0

bonne explication, je Je voudrais pouvoir t'avoir, et je serai de retour quand j'aurai atteint 15reps. – furedde

+0

Heureux d'être utile. Ne vous inquiétez pas du vote, ce n'est pas pour ça que je le fais (et Dennis Williamson a eu mon vote parce que c'était mieux). – msw