13

多くのgzipされたcsvファイルで特定の文字列を検索しようとしています。文字列は最初の行にあり、find、zcat、headを組み合わせて各ファイルの最初の行を取得することを考えました。しかし、私はそれらを一緒に動作させることはできません。

$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スクリプトを記述し、ファイルを反復処理して一時ファイルに書き込むことで問題を解決しましたが、何が間違っていたか、どのように実行するか、他の方法があるかどうかを知ることは素晴らしいことです。

4

4 に答える 4

8

これが機能することがわかるはずです。

find . -name "*.gz" | while read -r file; do zcat -f "$file" | head -n 1; done
于 2010-07-27T03:40:41.033 に答える
3

あなたがそれを求めたようにそれは働いた。

headその仕事をし、1行を印刷し、終了しました。その後、閉じたパイプに書き込もうとしzcatた後援の下で実行され、その努力のために致命的なSIGPIPEを受け取りました。xargsその子を死なせて、xargsはその理由を報告しました。

目的の動作を得るには、xargsに与える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/man内の10kファイルを約1分で処理しました。

于 2010-07-27T03:21:50.177 に答える
2

GNU Parallel http://www.gnu.org/software/parallel/がインストールされている場合:

find . -name '*.gz' | parallel 'zcat {} | head -n1'

http://www.youtube.com/watch?v=OpaiGYxkSuQでGNUParallelの紹介ビデオをご覧ください

于 2010-08-09T18:48:54.613 に答える
0
zcat -r * 2>/dev/null | awk -vRS= -vFS="\n" '{print $1}'
于 2010-07-27T02:30:18.610 に答える