поиск “created_at”: сопровождаемый в следующей строке “сделавшим ретвит”: в большом количестве json файлов для определенного диапазона

У меня есть большая сумма json файлов, и ранее мне сказали использовать следующую строку, чтобы искать, если твит создается в определенном диапазоне времени на дате:

grep -wirnEzc '},.*created_at":\s"Wed Oct 19 2(1:[0-5][0-9]:[0-5][0-9]|2:([0-2][0-9]:[0-5][0-9]|30:00)) .* 2016' *

Я не знаю, что следующее точно попытка представить:

2(1:[0-5][0-9]:[0-5][0-9]|2:([0-2][0-9]:[0-5][0-9]|30:00))

Что касается теперь, я должен изменить его так, чтобы я мог найти количество результатов возвращенным этим grep, которые являются между между 17 июля 2016 и 8 ноября 2016 для "created_at" поля. Вот пример одного из тех json файлов: https://hastebin.com/budovutume.scala

Поскольку Вы видите, что каждый json файл может содержать различные твиты. Так в основном я надеюсь перерывать все эти *.json файлы и искать "created_at": шаблоны, которые сопровождаются в следующей строке "retweeted": потому что другие вещи как профиль или аватар могли иметь атрибут "created_at":. И диапазон дат, который я ищу, 17 июля 2016 до 8 ноября 2016.

Пример интереса (не мудрый датой):

}, 
            "created_at": "Wed Dec 14 22:34:28 +0000 2016", 
            "retweeted": false, 
            "coordinates": null, 
            "in_reply_to_user_id_str": null, 
            "source": "<a href=\"https://ifttt.com\" rel=\"nofollow\">IFTTT</a>", 
            "in_reply_to_status_id_str": null, 
            "in_reply_to_screen_name": null, 
            "in_reply_to_user_id": null, 
            "extended_entities": {
3
задан 5 April 2018 в 03:54

1 ответ

Отвечать на Ваш первый вопрос: выражение 2(1:[0-5][0-9]:[0-5][0-9]|2:([0-2][0-9]:[0-5][0-9]|30:00)) просто регулярное выражение, соответствующие строки, которые запускаются с a 2, сопровождаемый любой 1:AB:CD, где A и C являются цифрами от 0-5 и B, и D являются цифрами от 0-9, или 2:AB:CD, где A является цифрой от 0-2, C является цифрой от 0-5, и B и D являются цифрами от 0-9, или 2:30:00. Это - очень сырой способ соответствовать всем случаям между 21:00:00 и 22:30:00, включительно. Запись такого регулярного выражения для соответствия датам или времена между некоторой произвольной начальной точкой и конечной точкой была бы очень утомительным осуществлением.

Канал на Ваш файл JSON больше не активен, но я попытаюсь ответить на Ваш основной вопрос на основе информации, которую Вы предоставили. Между прочим, Ваш оригинал grep команда является немного противоречащей, так как Вы даете обоим опцию -n (распечатайте номера строки), и -c (распечатайте только количество количества строк, соответствующих), которые являются взаимоисключающими. Таким образом, я не абсолютно уверен, какую информацию Вы хотите извлечь (номера строки или количество).

Вот команда, которая извлечет все строки, содержащие слова created_at и которые предшествуют строке, содержащей слова retweeted:

grep -rn -B1 'retweeted' * | grep 'created_at'

Идея состоит в том, что первый grep печатает каждое соответствие строки retweeted и также строка перед ним. Второй grep отфильтровывает строки, содержащие created_at.

Теперь у Вас будет список всех дат с их номерами строки. Отфильтровывание диапазона дат более трудно; если только необходимо редко делать это, Вы могли бы использовать регулярное выражение

grep -E '(July (1[7-9]|[23].)|August .*|September .*|October .*|November [1-8]), 2016'

для Вашего конкретного диапазона дат (но чем более сложный диапазон, тем тяжелее этот метод добирается).

0
ответ дан 1 December 2019 в 20:30

Другие вопросы по тегам:

Похожие вопросы: