2010-07-27 13 views
11

पर जाएं I gziped csv फ़ाइलों में एक निश्चित स्ट्रिंग को खोजने का प्रयास कर रहा हूं, स्ट्रिंग पहली पंक्ति में स्थित है और मेरा विचार प्रत्येक फ़ाइल की पहली पंक्ति प्राप्त करना था खोज, zcat और सिर संयोजन के द्वारा। लेकिन मैं उन्हें एक साथ काम करने के लिए नहीं मिल सकता है।zcat को पाइप किए गए परिणाम ढूंढें और फिर

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

हालांकि मैं, एक bash स्क्रिप्ट लिखने फ़ाइलों पर पुनरावृत्ति और एक अस्थायी फ़ाइल को लिख कर समस्या हल हो, यह क्या मैं गलत किया था पता करने के लिए बहुत अच्छा होगा, यह कैसे करना है, और अगर वहाँ हो सकता है इसके बारे में जाने के अन्य तरीके।

उत्तर

7

आपको लगता है कि यह काम करेगा खोजना चाहिए:

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

बेकार ढंग से काम किया, धन्यवाद। पता नहीं था कि आप इसका उपयोग कर सकते हैं और उस तरह पढ़ सकते हैं, मुझे याद होगा। – furedde

+0

आप इसका भी उपयोग कर सकते हैं: 'f में * .gz; zcat $ f | सिर -1 एन; किया गया ' – arekolek

+0

@arekolek: जब तक आप' shopt -s globstar 'का उपयोग नहीं करते हैं, तब तक रिकर्सिव नहीं है; **/*। gz' में f के लिए, जबकि 'find' रिकर्सिव है जब तक कि आप इसे' -मैक्सडेपथ 'से सीमित न करें। –

3

जैसा आपने पूछा था, यह काम करता था।

head ने अपना काम किया, एक पंक्ति मुद्रित की, और बाहर निकला। zcat फिर xargs के अनुपालन के तहत चलने से एक बंद पाइप को लिखने की कोशिश की गई और इसके प्रयासों के लिए घातक सिगिप प्राप्त हुआ। अपने बच्चे को मरने के बाद, xargs ने क्यों रिपोर्ट की।

वांछित व्यवहार प्राप्त करने के लिए, आपको x12s देने के लिए find -exec ... निर्माण या कस्टम zhead की आवश्यकता होगी।

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

यह एक मिनट के बारे में/usr/share/आदमी में 10k फ़ाइलें संसाधित:

कबाड़ कोड मैं फ्रिज के पीछे पाया गयी।

+0

अच्छा स्पष्टीकरण जीएनयू समानांतर करने के लिए परिचय वीडियो मैं इच्छा है कि मैं आपको उखाड़ फेंक सकता हूं, और जब मैं 15reps तक पहुंच गया हूं तो मैं वापस आऊंगा। – furedde

+0

सहायता की खुशी है। वोट के बारे में चिंता न करें, यही कारण है कि मैं ऐसा नहीं करता (और डेनिस विलियमसन को मेरा वोट मिला क्योंकि यह बेहतर था)। – msw