2010-07-27 6 views
11

Sto provando a cercare una determinata stringa in un sacco di file CSV gzip, la stringa si trova nella prima riga e il mio pensiero era di ottenere la prima riga di ogni file combinando find, zcat e head. Ma non riesco a farli lavorare insieme.trovare i risultati con piping su zcat e quindi su capo

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

Anche se ho risolto il problema scrivendo uno script bash, scorrere il file e la scrittura di un file temporaneo, sarebbe bello sapere che cosa ho fatto di sbagliato, come farlo, e se ci potrebbe essere altri modi per farlo.

risposta

7

Si dovrebbe trovare che questo funzionerà:

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

ha funzionato perfettamente, grazie. Non sapevo che potevi usare mentre leggevi così, me lo ricorderò. – furedde

+0

Puoi anche usare: 'per f in * .gz; do zcat $ f | testa -n 1; done' – arekolek

+0

@arekolek: che non è ricorsivo a meno che non si usi 'shopt -s globstar; per f in **/*. gz', mentre 'find' è ricorsivo a meno che non lo si limiti con' -maxdepth'. –

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

Ha funzionato come richiesto.

head ha fatto il suo lavoro, ha stampato una riga ed è uscito. zcat quindi sotto gli auspici di xargs ha provato a scrivere su una pipe chiusa e ha ricevuto un SIGPIPE fatale per i suoi sforzi. Morto suo figlio, xargs ha riportato il motivo.

Per ottenere il comportamento desiderato, è necessario eseguire la costruzione di find -exec ... o una personalizzata zhead da assegnare a xarg.

aggiunto codice spazzatura ho trovato dietro il frigo:

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

E elaborati 10k file in/usr/share/man in circa un minuto.

+0

buona spiegazione, mi Vorrei poterti invogliare, e tornerò quando avrò raggiunto 15 giri. – furedde

+0

Felice di essere di aiuto. Non preoccuparti del voto, non è per questo che lo faccio (e Dennis Williamson ha ottenuto il mio voto perché era meglio). – msw