サイズが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
ファイルの正規表現を一致させるコマンドラインユーティリティ。正規表現は、探しているテキストを説明する効率的な方法です。-P
grep
「Perl互換正規表現」を使用するように教えてください。 grepのマニュアルページでは、これを「非常に実験的」と説明しています!-o
grep
一致するテキストのみを出力するように指示します。デフォルトでは、一致grep
するものが見つかるたびに通常、行全体が出力されます。'(?<="username":")[^"]*'
正規表現そのものです。'....'
コマンドラインシェルがその中の内容を解釈できないように単一引用符で囲みました。(?<=...)
これは…リバース主張。他のものよりも先に一致させたいのですが、出力に含めないように"username":"
したいと思います。[^"]*
「ではなく、できるだけ多くの文字を意味します。"
再細分化できます。[..]
キャラクタークラスです。現在、角かっこの間のすべての文字が許可されています。しない限り...^"
^
キャレットを文字クラスの最初の文字として使用すると、これは次のことを意味します。いいえ次の文字のいずれか*
[^"]
ゼロ以上の前の項目(この場合は全体)を示します。
パイピングでsort
ユーザー名をアルファベット順に並べ替えます。オプションは、-u
「一意の項目のみ」、つまり重複項目がないことを意味します。
注:これらはすべて、一致するパターンがファイルの他の場所に表示されない(または可能性が低い)、JSON自体の破損によって一致が失敗しないと仮定します(その場合もあります)。ファイルがどのように破損しているのかわからない。)
編集する:
行が長すぎるという苦情が頻繁にあり、何らかのgrep
理由sed -e 's/,/,\n/'
で実際には機能しないため、このsplit
コマンドはファイルをより管理しやすい塊に分割するために使用されます。
答え2
壊れる非常に長いJSONレコードがあるようですgrep -P
。代替ソリューションは次のとおりです。
grep -o '"username":"[^"]*' users.json \
| cut -d '"' -f 4 \
| uniq \
| sort -u \
> usernames.txt
ここから、grep
「ユーザー名:値」フィールド全体を抽出し、cut
値を抽出してuniq | sort -u
ユーザー名を一意にします。
uniq
必要ありません。 3GBファイルの場合は、連続して重複する数百万の名前のリストを取得したいと思います。役に立たないように見えることは、仕事の負担をuniq |
軽減し、作業をより速く進めることができます。sort
そうでなければ病気ではありません。