2010-07-27 21 views
11

Estoy tratando de buscar una cierta cadena en una gran cantidad de archivos csv gziped, la cadena se encuentra en la primera fila y mi idea era obtener la primera fila de cada archivo combinando find, zcat y head. Pero no puedo hacer que trabajen juntos.encontrar resultados canalizados a zcat y luego a la cabeza

$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 ... 

Aunque he resuelto el problema escribiendo un script bash, interactuando sobre los archivos y escribir en un archivo temporal, sería bueno saber qué hice mal, cómo hacerlo, y si podría haber otras formas de hacerlo.

Respuesta

7

Usted debe encontrar que esto funcionará:

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

funcionó sin problemas, gracias. no sabía que podrías usar mientras y leer así, lo recordaré. – furedde

+0

También puede usar: 'for f in * .gz; hacer zcat $ f | cabeza -n 1; hecho' – arekolek

+0

@arekolek: que no es recursivo a menos que use 'shopt -s globstar; para f en **/*. gz', mientras que 'find' es recursivo a menos que lo limite con' -maxdepth'. –

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

Funcionó como usted lo pidió.

head hizo su trabajo, imprimió una línea y salió. zcat que luego se ejecutaba bajo los auspicios de xargs intentó escribir en una tubería cerrada y recibió un SIGPIPE fatal por sus esfuerzos. Al morir su hijo, xargs informó el por qué.

Para obtener el comportamiento deseado, necesitaría find -exec ... construcción o una personalizada zhead para dar a xargs.

añade código basura que encontré detrás de la nevera:

#!/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 

procesó 10k archivos en/usr/share/man en aproximadamente un minuto.

+0

buena explicación, ojalá pudiera votarte, y volveré cuando haya llegado a 15 puntos. – furedde

+0

Me alegra ser de ayuda. No se preocupe por la votación, no es por eso que lo hago (y Dennis Williamson obtuvo mi voto porque era mejor). – msw

Cuestiones relacionadas