テキストファイルに含まれるJSONドキュメントからフィールドを抽出する

テキストファイルに含まれるJSONドキュメントからフィールドを抽出する

次のテキスト行があり、このテキスト行のJSON部分からいくつかのフィールドを抽出する必要があります。

June 27th 1997, 10:11:52.621 {"serviceId":"00034","AccessKey":"SBCDSCB","trackID":"KOLPSLSLSLL99029283","membersId":"TEST_0002930493","shopperInfo":{"emailid":"[email protected]"},"parkid":{"parkssID":"carrier-park"},"cartinfo":{"checkType":"preorder","detailsmetis":"card","currency":"US","grosscount":"10","reedeem":".00","discount":".00","tokenvalue":{"token":"11102020392023920920393993","bin":"00000000","digit":"0000","expirationDate":"202209","price":"10"}},"cartdetails":[{"dones":[{"donesnames":"test","price":"003","qunt":"1"}]}]}

必要な出力は次のとおりです。

serviceId,trackID,currency,grosscount 
00034,KOLPSLSLSLL99029283,US,10

上記のような結果が得られる方法を提案してください。

awk私はそのコマンドといくつかの関連クエリを試しましたが、うまくいきませんsedでした。

答え1

使用jq:

echo "serviceId,trackID,currency,grosscount"
cut -d' ' -f5- < file \
| jq -r '[.serviceId, .trackID,.cartinfo.currency,.cartinfo.grosscount] | @csv'

を使用する代わりに、@csv以下を使用してフィールドの周りに引用符を追加することもできますpaste

echo "serviceId,trackID,currency,grosscount"
cut -d' ' -f5- < file \
| jq -r '.serviceId, .trackID,.cartinfo.currency,.cartinfo.grosscount' \
| paste -sd,

答え2

JSONを含むJSONドキュメントと同じ構造を持っているとします。その他の質問、私達は利用できますjqそこに入れたようなコマンド:

jq -r '
    [ "serviceId", "trackID", "currency", "grosscount" ],
    [ .serviceId, .trackID, .cartinfo.currency, .cartinfo.grosscount ] |
    @csv'

{ここで欠けている唯一のことは、最初のオンラインデータの前にJSON以外のデータを削除することです。私たちはできますsed

sed 's/^[^{]*//' file |
jq -r '
    [ "serviceId", "trackID", "currency", "grosscount" ],
    [ .serviceId, .trackID, .cartinfo.currency, .cartinfo.grosscount ] |
    @csv'

質問のデータを考慮すると、次のようになります。

"serviceId","trackID","currency","grosscount"
"00034","KOLPSLSLSLL99029283","US","10"

関連情報