タイムスタンプに関連するファイルのサブセットを取得する

タイムスタンプに関連するファイルのサブセットを取得する

辞書形式のいくつかのjsonファイルがあります。行は次のとおりです

{"a":"1", "b":"2", "c":"3", "time":1334572551435}
{"a":"1", "b":"2", "c":"4", "time":1334575352456}
{"a":"2", "b":"2", "c":"7", "time":1334575335345}
...

時間はUTC形式です。ファイル全体には約3億の固有ラインがあります(おそらく同時に2回程度)。特定の時間(例:1334575352456と間)の回線をどのように選択しますか1334575353456

私は個人的にいくつかのチュートリアルで次のアイデアを得ました。

awk ’$"time" == 1334575352456, $"time" == 1334575353456’ inputfile.json

"time"とにかく、このソリューションは鍵付きのdictsではなく熱用であるようです"time"(実際に$"time"はそうする必要があります$4)。

答え1

努力する:

$ awk -F'[:}]' '$(NF-1) >= 1334575352456 && $(NF-1) <= 1334575353456' file
{"a":"1", "b":"2", "c":"4", "time":1334575352456}

-F'[:}]'フィールド区切り記号を:またはに}設定すると、最後から2番目のフィールドにアクセスして時間値にアクセスできます$(NF-1)

出力を保存するには、次のようにします。

$ awk -F'[:}]' '$(NF-1) >= 1334575352456 && $(NF-1) <= 1334575353456' file > output.txt

上記の条件がある場合は、その場所で編集するオプションをgawk 4.1.0使用できます。-i

$ awk -i inplace -F'[:}]' '$(NF-1) >= 1334575352456 && $(NF-1) <= 1334575353456' file

答え2

入力はJSONオブジェクトのセットなので、JSON認識ツールを使用することをお勧めします。

JSONプロセッサを使用して、値がいくつかの値と時間値の間にjqある項目のみを抽出します(ここで使用されているオプションは「コンパクト」出力を選択します)。timet0t1-c

jq -c --argjson t0 1334572551435 --argjson t1 1334575352456 \
    'select(.time > $t0 and .time < $t1)' file

Miller()と同じコマンドmlrですが、時間範囲の始まりと終わりをパラメータ化しません。

mlr --json filter '$time > 1334572551435 && $time < 1334575352456' file

関連情報