2010-07-27 4 views
11

Ich versuche, nach einer bestimmten Zeichenfolge in vielen CSP-Dateien zu suchen, die Zeichenfolge befindet sich in der ersten Zeile und mein Gedanke war, die erste Zeile jeder Datei zu erhalten durch Kombination von Fund, Zcat und Kopf. Aber ich kann sie nicht dazu bringen, zusammenzuarbeiten.Ergebnisse finden piped zu zcat und dann zum Kopf

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

Obwohl ich das Problem, indem ein Bash-Skript gelöst, Iterieren über die Dateien und in eine temporäre Datei zu schreiben, wäre es toll, zu wissen, was ich falsch gemacht habe, wie es zu tun, und wenn es sein könnte andere Möglichkeiten, um darüber zu gehen.

Antwort

7

Sie sollten feststellen, dass dies funktionieren wird:

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

hat einwandfrei funktioniert, danke. Ich wusste nicht, dass du es benutzen kannst und lies so, ich werde mich daran erinnern. – furedde

+0

Sie können auch verwenden: 'für f in * .gz; mach zcat $ f | Kopf -n 1; done' – arekolek

+0

@arekolek: Was nicht rekursiv ist, es sei denn du benutzt 'shopt -s globstar; für f in **/*. gz', während 'find' rekursiv ist, es sei denn, man limitiert es mit' -maxdepth'. –

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

Es funktionierte, wie Sie es verlangten.

head hat seinen Job gemacht, eine Zeile gedruckt, und beendet. zcat dann läuft unter der Schirmherrschaft von xargs versucht, in eine geschlossene Leitung zu schreiben und erhielt eine tödliche SIGPIPE für seine Bemühungen. Nachdem sein Kind gestorben war, meldeten Xargs das Warum.

Um das gewünschte Verhalten zu erhalten, müssten Sie find -exec ... Konstruktion oder eine benutzerdefinierte zhead an Xargs geben.

hinzugefügt Junk-Code, den ich hinter dem Kühlschrank gefunden: in etwa einer Minute

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

Es verarbeitet 10k-Dateien in/usr/share/man.

+0

Gute Erklärung, ich Ich wünschte, ich könnte dich aufrüsten, und ich werde zurück sein, wenn ich 15 Wiederholungen erreicht habe. – furedde

+0

Ich bin froh, Ihnen helfen zu können. Mach dir keine Sorgen wegen der Abstimmung, das ist nicht der Grund, warum ich es mache (und Dennis Williamson hat meine Stimme bekommen, weil es besser war). – msw