辞書形式のいくつかの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
ある項目のみを抽出します(ここで使用されているオプションは「コンパクト」出力を選択します)。time
t0
t1
-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