0

ファイル内のいくつかの文字列を検索したいときにawkスクリプトを書いています。私が直面している問題は...

ファイルは、ある意味で非常に巨大です..約100万行。

ファイルの最後の行にある文字列を検索すると、残りの最初の行を不必要にトラバースしたため、文字列を引数として指定すると、コマンドが表示されるはずです。ファイルの行番号..または、ファイルに対してバイナリ検索を実行したいのですが、これに関するリダイレクト。

補足として、文字列は単一の文字列ではありません。ある時点で検索する文字列が複数あります。

4

3 に答える 3

1

何をするかに関係なく、データがファイル内にある場合は、処理(効率に関係なく)、並べ替え、検索などを実行する前に、データをメモリに読み込む必要があります。

メモリが不足していませんか、それとも時間が心配ですか?メモリが問題にならないのであれば、最近では100万件のレコードはそれほど大きくはないようです。

データファイルに特定の文字列が存在するかどうかを確認したいだけの場合は、を使用してみてくださいgrep。例えば、

 grep -n target_string data.txt

ターゲットがファイルで見つかった場合は、行と行番号を出力します。grepのmanページで詳細を確認してください。

ファイル内の行を見つけて処理したい場合は、機能grepしません。awk(前述のように)を使用するsedか、Pythonまたはその他の言語でカスタムスクリプトを確認または作成する必要があります。いずれの場合も、ファイルはいずれかの方法で読み取る必要があります。

おそらく、ファイルをチャンクに分割してから特定の部分を処理します(検索する場所を事前に決定できる場合-質問からはそうは思われませんが)

于 2012-07-18T12:02:30.523 に答える
0

100万行ありますが、ファイルの大きさはどれくらいですか?1行100万行の1行でファイルサイズは約1MBになります。これは非常に小さく、時間の観点からは解析に時間がかかりません。80文字/行のファイルサイズは76MBで、1文字/行のファイルよりも読み取りに時間がかかりますが、簡単な検索ではそれほど時間はかかりません。

数メガバイトを見ている場合は、ファイルを一度読み取ってそのインデックスを作成する必要がありますが、これが1回限りのタスクまたはまれなタスクである場合、そのようなインデックスの作成にかかる時間は、grepまたはを使用してファイルを直接検索しますawk

同様に、絶えず変化するファイルに対してこれを行う必要がある場合は、インデックスが古くなり、インデックスを更新する必要があるため、インデックスを作成してもあまり効果はありません(ファイル全体の再スキャンが必要です)。正確な結果を得るには。

明確ではない他の要件があるように思われるので、包括的な問題の詳細が必要になります。この検索をどのくらいの頻度で実行しますか?ファイルはどのくらい静的ですか?結果をどうしますか?要するに、あなたはこれをどのようなニーズ/アプリケーションのためにやっていますか?

とはいえ、インデックスを作成したい場合は、ファイルを1行ずつ読み取り、空白で分割してから、データストア(SQLiteデータベース?BDBデータベース?)にその単語をその行と一緒に格納するだけです。に表示され、そのストアに直接クエリを実行します。うまくいけば、最初の生成は非常に高価であることがわかるので、これはファイルが静的であり、ファイルに対して多くの検索を実行している場合にのみ実行する価値があります。

于 2012-07-18T12:14:37.323 に答える
0

ファイルに対してバイナリ検索を実行するとおっしゃっています。これにより、入力が並べ替えられ、探している文字列が行の先頭に固定されていると想定できます。二分探索を行うために、と呼ばれるユーティリティがありますがlook、それは行番号を報告しません。行番号を取得するには、入力に行番号を追加するだけです。

# Append line numbers to each line
$ awk '{print $0, NR}' input > tmp   

# Do a binary search, looking for the string 'string'
$ look string tmp 

lookおよびseqは標準のユーティリティではないため、ご使用のプラットフォームでは使用できない場合があります。

于 2012-07-18T14:10:34.357 に答える