根据日期字段从特定时间间隔获取 JSON 个文件

Get JSON files from particular interval based on date field

我有很多 json 文件,其结构如下所示:

{
  key1: 'val1'
  key2: {
          'key21': 'someval1',
          'key22': 'someval2',
          'key23': 'someval3',
          'date': '2018-07-31T01:30:30Z',
          'key25': 'someval4'
  }
  key3: []
  ... some other objects
 }          

我的目标是仅获取日期字段来自某个时期的这些文件。 例如从 2018-05-20 到 2018-07-20。 我不能根据创建这些文件的日期,因为所有这些都是在一天内生成的。 也许可以使用 sed 或类似程序?

这样试试:

  1. 查找在线转换器。 (例如:https://codebeautify.org/json-to-excel-converter#)并将 Json 转换为 CSV

  2. 用 Excel 打开 CSV 文件

  3. 过滤您的数据

幸运的是,这种格式的日期可以作为字符串进行比较。您只需要一些东西来解析 JSON,例如Perl:

perl -l -0777 -MJSON::PP -ne '
   $date = decode_json($_)->{key2}{date};
   print $ARGV if $date gt "2018-07-01T00:00:00Z";
' *.json
  • -0777 使 perl 吞噬整个文件而不是逐行读取它们
  • -lprint
  • 添加换行符
  • $ARGV包含当前处理文件的名称

参见 JSON::PP for details. If you have JSON::XS or Cpanel::JSON::XS,您可以切换到它们以加快处理速度。

我必须修复输入(将 ' 替换为 ",添加逗号等)以使解析器满意。

如果您的文件实际上包含有效的 JSON,则可以使用 在一行中完成任务,例如:

jq 'if .key2.date[0:10] | (. >= "2018-05-20" and . <= "2018-07-31") then input_filename else empty end' *.json

这只是一个例子。 jq 有日期处理函数来处理更复杂的需求。

处理准JSON

如果您的文件包含准JSON,那么您可以将jq 与JSON 整流器结合使用。如果您的样本具有代表性,那么 hjson 可以使用,例如

for f in *.qjson
do
  hjson -j $f | jq --arg f "$f" '
    if .key2.date[0:7] == "2018-07" then $f else empty end'
done