無効な3GB .jsonファイルから特定のコンテンツを含む.txtファイルを生成する

無効な3GB .jsonファイルから特定のコンテンツを含む.txtファイルを生成する

サイズが3GBで無効なjsonのusers.jsonというファイルがあります。だから私が望むのは、ファイルのテキスト内容を読み、ファイルに含まれるユーザー名である必要な情報を取得し、重複がない限り、1行に1つのユーザー名を含める必要があるusernames.txtファイルに書き込むことです。

jsonファイルのユーザー名の形式は「username」:「someUsername」です。

すべてのユーザー名を収集してテキストファイルに入れ、重複がないことを確認するにはどうすればよいですか?

Node.jsとPHPで試してみましたが、まだ何も機能していません。 bashを使って素晴らしい仕事をすることができることを願っています。

ファイルに含まれるデータの例(すでにフォーマットを参照しているため、あまり役に立たない可能性があります"username":"someUsername"):

username":"satish_nanded","original_ff_id":"99554"},"100003":{"username":"sweetnamu","original_ff_id":"100003"}},"08fdlhNuZEM1z8q4mQftYUtO7uC3":{"575511":{"username":"lrlgrdnr","original_ff_id":"575511"}},"08fe4Dg7NeOTItq3b9Pi8ORsX5J2":{"59520":{"username":"joneljon","original_ff_id":"59520"}},"08gsZHsbm9Rew4S2IqcbGvD9Fct1":{"724707":{"username":"jacksonc4565","original_ff_id":"724707"}

ベストアンサー1

このgrepコマンドを使用して、目的のパターンを一致させ、重複sort項目をフィルタリングできます。入力ファイルが次input.jsonのような場合、出力は次のようになりますusernames.txt

grep -P -o '(?<="username":")[^"]*' input.json | sort -u > usernames.txt

それを破壊する:

  • grepファイルの正規表現を一致させるコマンドラインユーティリティ。正規表現は、探しているテキストを説明する効率的な方法です。
  • -Pgrep「Perl互換正規表現」を使用するように教えてください。 grepのマニュアルページでは、これを「非常に実験的」と説明しています!
  • -ogrep一致するテキストのみを出力するように指示します。デフォルトでは、一致grepするものが見つかるたびに通常、行全体が出力されます。
  • '(?<="username":")[^"]*'正規表現そのものです。
    • '....'コマンドラインシェルがその中の内容を解釈できないように単一引用符で囲みました。
    • (?<=...)これは…リバース主張。他のものよりも先に一致させたいのですが、出力に含めないように"username":"したいと思います。
    • [^"]*「ではなく、できるだけ多くの文字を意味します。"再細分化できます。
    • [..]キャラクタークラスです。現在、角かっこの間のすべての文字が許可されています。しない限り...
    • ^"^キャレットを文字クラスの最初の文字として使用すると、これは次のことを意味します。いいえ次の文字のいずれか
    • *[^"]ゼロ以上の前の項目(この場合は全体)を示します。

パイピングでsortユーザー名をアルファベット順に並べ替えます。オプションは、-u「一意の項目のみ」、つまり重複項目がないことを意味します。

注:これらはすべて、一致するパターンがファイルの他の場所に表示されない(または可能性が低い)、JSON自体の破損によって一致が失敗しないと仮定します(その場合もあります)。ファイルがどのように破損しているのかわからない。)

編集する: 行が長すぎるという苦情が頻繁にあり、何らかのgrep理由sed -e 's/,/,\n/'で実際には機能しないため、このsplitコマンドはファイルをより管理しやすい塊に分割するために使用されます。

おすすめ記事