2017-01-15 7 views
1

次のデータを持つファイルがあります。私はちょうどownerIdの数字とで区切られたprofileIDの値がほしいです。sedを使用しています。行内に一部の文字列しか印刷しません。

マイファイル:

ObjectId("57a046a06f858a9c73b3468a"), "ownerId" : "923003345778", "profileId" : "FreeBundles,LBCNorthParentOffer", "instanceId" : null, "queuedFor" : "unassigned", "state" : "active", "createDateTime" : 1470121632, "startDateTime" : 1470121632, "expireDateTime" : 1485673632, "removeDateTime" : 1487747232, "extensionDateTime" : null, "cancelled" : false, "mode" : "onceOff", "nextMode" : "none", "profileData" : { "serviceProfileId" : "ecs19", "counter" : 1 } } 
ObjectId("57a046a06f858a9c73b34688"), "cancelled" : false, "createDateTime" : 1470121632, "expireDateTime" : 1557514799, "extensionDateTime" : null, "instanceId" : null, "mode" : "onceOff", "nextMode" : "none", "ownerId" : "923003345778", "profileData" : { "serviceProfileId" : "ecs19", "counter" : 1 }, "profileId" : "Prov3G,HLRProv", "queuedFor" : "unassigned", "removeDateTime" : 1557514799, "startDateTime" : 1470121632, "state" : "active" } 
ObjectId("56d48bd38a8b93baa708fcfa"), "ownerId" : "923003309452", "profileId" : "DiscountOnUsage,Segment04", "instanceId" : null, "queuedFor" : "unassigned", "state" : "active", "createDateTime" : 1456770003, "startDateTime" : 1456770003, "expireDateTime" : null, "removeDateTime" : null, "extensionDateTime" : null, "cancelled" : false, "mode" : "onceOff", "nextMode" : "none", "profileData" : { "serviceProfileId" : "ecs19", "counter" : 1 } } 
ObjectId("560ed95f6ca6e0703cf26fcc"), "cancelled" : false, "createDateTime" : 1443813727, "expireDateTime" : 1544381999, "extensionDateTime" : null, "instanceId" : null, "mode" : "onceOff", "nextMode" : "none", "ownerId" : "923003309452", "profileData" : { "serviceProfileId" : "ecs19", "counter" : 1 }, "profileId" : "Prov3G,HLRProv", "queuedFor" : "unassigned", "removeDateTime" : 1544381999, "startDateTime" : 1443813727, "state" : "active" } 

が出力:

923003345778 : FreeBundles,LBCNorthParentOffer 

923003345778 : Prov3G,HLRProv 

923003309452 : DiscountOnUsage,Segment04 

923003309452 : Prov3G,HLRProv 

誰もが知っている場合も、詳細に答えを私に説明してください。

+0

これはjqまたはxidelの仕事であり、sedの仕事ではありません。 –

+0

あなたは自分で努力せずにコードを渡したいと思っていますか?してください参照してください:http://stackoverflow.com/help/how-to-ask –

答えて

1
$ sed 's/.*ObjectId("\([^"]*\).*"profileId" *: *"\([^"]*\).*/\1 : \2/' file 
57a046a06f858a9c73b3468a : FreeBundles,LBCNorthParentOffer 
57a046a06f858a9c73b34688 : Prov3G,HLRProv 
56d48bd38a8b93baa708fcfa : DiscountOnUsage,Segment04 
560ed95f6ca6e0703cf26fcc : Prov3G,HLRProv 

私は本当にそれは前方に非常にまっすぐだとして何らかの説明が必要になると思いますが、ご質問があれば私に知らせてはいけません。

+1

ありがとう多くの仕事をした、私はObjectIdの代わりにownerIdが必要なので、私はそれを 'sed 's /.* ownerId": "\" \ "[*"] * \)。*/\ 1:\ 2/'' – user7352907

0

これは、あなたが自分自身に入れて管理しているのはやや厄介な状況です。

一般に、sedのようなプレーンテキストツールを使用して構造化データを処理する必要はありません。あなたが思いつく解決策は、JSONフィールド間の空白や改行などの書式設定の変更や、コーナーケース(引用符付きのJSON文字列など)の処理には厄介です。 JSONをお持ちの場合は、JSONツールを使用して処理したいと考えています。

ただし、そこにJSONはありません。これは、すでに一部が切り取られているBSON(MongoDBの可能性が高い)のテキスト表現です。

あなたは本当に

この問題を解決するための健全な方法をやりたいのMongoDBはあなたにJSONを与えるとjqのようなものは、書式設定をやらせるようにすることです。あなたは適切なJSONファイルを入手したら、これは

jq -r '"\(.ownerId) : \(.profileId)"' file.json 

mongoexport

としては、あなたのここでの友人、またはMongoDBのシェルにクエリの周り JSON.stringify()を入れられるようにシンプルになります。それは最初にこのデータをどのように入手したかによって異なります。このアプローチでは、未処理のデータを保存する必要がありますが、とにかく、BSONを断片化してしまったものは、信頼性を向上させるために同様のものに置き換えなければならないと思います。

MongoDBシェルからデータを入手した場合は、ここでフォーマットを行うことを検討することもできます。 SED

でこの混乱の中に深く自分自身をハックする方法

しかし、あなたは現在、適切なJSONを持っていないので、あなたは、SEDと、この混乱のうち、自分自身をハックしようとすることをお勧めします。これはひどい考えですが、私はあなたに十分なストレスを感じることができません決しては実稼働環境でこれをしたいと考えています。あなたがそうするならば、あなたは以前よりも深刻な混乱に陥り、そのような悪循環は幸せな場所ではありません。

私は、あなたが急いで一回限りのことをするようなもので、次回は適切にやることを約束しているので、再び使用することはありません。あなたはに慎重に結果を確認したい。ここは行く:

  1. 1行に1つの完全なオブジェクト:

    sed 'h;/^.*"profileId"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/!d;s//\1/;x;/^.*"ownerId"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/!d;s//\1/;G;s/\n/ : /' file.bsonish 
    

    これは、入力されたデータについて次のように仮定します。間違った場所に改行があればこれを破るでしょう。

  2. "いずれかownerIdまたはprofileIDフィールド

さらに、それは常に便利な機能である壊れたデータを、認識しません。面倒なことに、ownerIdフィールドとprofileIdフィールドは、特定の順序で表示する必要はありません。

次のように動作します:

# Save a copy of the input data; we'll isolate the fields separately. 
h 

# See if there's a profileId field. If not, the line is silently dropped. 
/^.*"profileId"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/!d 
# Isolate that profileId field. // in this context means: reuse the last 
# regex (the big one) 
s//\1/ 

# Now swap in the saved input data. We'll get ownerId next. 
x 
# Isolate ownerId as before. If there is no ownerId field, drop line silently. 
/^.*"ownerId"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/!d 
s//\1/ 

# append profileId field in hold buffer to what we have 
G 

# Replace the newline between the two with a colon and some spaces. 
s/\n/ :/

関連する問題