我有一些字典格式的 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 亿个独特的行(无论如何,同一时间可能会出现两次)。我如何为某个特定时间选择线路,例如1334575352456
和之间1334575353456
?
我个人从一些教程中得到了下一个想法:
awk ’$"time" == 1334575352456, $"time" == 1334575353456’ inputfile.json
不管怎样,我想这个解决方案是针对列的"time"
,而不是针对带有键的字典的"time"
(实际上$"time"
应该是$4
)
答案1
尝试:
$ awk -F'[:}]' '$(NF-1) >= 1334575352456 && $(NF-1) <= 1334575353456' file
{"a":"1", "b":"2", "c":"4", "time":1334575352456}
-F'[:}]'
设置字段分隔符为:
或}
,因此您可以使用 访问倒数第二个字段来访问时间值$(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 感知工具是有意义的。
使用jq
JSON 处理器仅提取值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