2010-07-27 7 views
11

Я пытаюсь найти определенную строку во многих файлах czv gziped, строка находится в первой строке, и я думал, что нужно получить первую строку каждого файла путем объединения find, zcat и head. Но я не могу заставить их работать вместе.найти результаты, отправленные в 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 ... 

Хотя я решил проблему, написав Баш скрипт, итерация файлы и записи во временный файл, было бы здорово, чтобы знать, что я сделал не так, как это сделать, и если бы другие способы сделать это.

ответ

7

Вы должны найти, что это будет работать:

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

работал безупречно, спасибо. не знал, что вы можете использовать и читать так, я запомню это. – furedde

+0

Вы также можете использовать: 'for f in * .gz; do zcat $ f | head -n 1; done' – arekolek

+0

@arekolek: что не является рекурсивным, если вы не используете 'shopt -s globstar; для f в **/*. gz', а 'find' - рекурсивный, если вы не ограничиваете его' -maxdepth'. –

3

Он работал так, как вы просили.

head выполнил свою работу, распечатал одну строку и вышел. zcat, затем под управлением под номером xargs попытался написать закрытую трубу и получил фатальный SIGPIPE за свои усилия. Когда его ребенок умирает, xargs сообщили о причинах.

Для того, чтобы получить желаемое поведение, вам понадобится строительство find -exec ... или обычай zhead, чтобы дать xargs.

добавил вредную код, который я нашел за холодильник:

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

Он обрабатывается 10k файлы в/USR/доли/человек примерно за минуту.

+0

Хорошее объяснение, я хочу, чтобы я мог поддержать вас, и я вернусь, когда достиг 15pps. – furedde

+0

Рад помочь. Не беспокойтесь о голосовании, это не то, почему я это делаю (и Деннис Уильямсон получил мой голос, потому что это было лучше). – msw