Использование dateadd
и dategrep
из dateutils:
dategrep -i "%Y/%m/%d %T" ">=$(dateadd now -30d)"
dateadd
вычисляет дату и время от настоящего момента до 30 дней назад. Затем dategrep
печатает только строки из стандартного ввода, которые содержат строку даты, более новую или равную (>=
), чем эта. В этом случае формат даты строк журнала должен быть указан с помощью -i
.
Итак, было несколько вещей, которые помогли, но главное, что заставило это работать, - это использование sort | uniq -c
вместо gawk, согласно Грегори Нисбету .
Я также использовал комментарий @ dave_thompson_085 о tr -sc '[: alpha:]' '\ n'
. Флаг -s
объединяет повторы, что означает, что мне не нужно удалять пустые строки, а -c
инвертирует набор символов для поиска. Побочный эффект -c
заключается в том, что вы можете использовать только один заменяющий символ вместо набора. Также спасибо Дэйву за уловку о grep и точных совпадениях строк ( -x
). Если бы у меня была репутация, чтобы проголосовать за этот комментарий, я бы сделал это.
Наконец, мне пришлось использовать дополнительный код, чтобы удалить объекты XML ( "
) и вырезать HTML (избыток
). В getArticleText
, новая команда sed выглядит так: | sed -e 's / "/" / g' -e 's / g' -e 's /> /> / g' -e 's / & / & / g '-e' s /<.*>// g '
. Каждое выражение ( -e
для цепочки команд) имеет дело с разными объектами HTML. Я попробовал несколько более полных варианты (например, использование perl согласно StackOverflow ), но они не работали в моем случае из-за проблем, связанных с машиной. Окончательный сценарий можно увидеть в моем репозитории wordcount .
Скрипт завершился на моей машине за 3 часа 20 минут, но это еще и 6-ядерный процессор AMD много лет назад с жестким диском. Ваш пробег может отличаться, но для меня этого было достаточно.
Я не буду принимать этот ответ, поэтому что если @Gregory Nisbet или @ dave_thompson_085 захотят опубликовать свой ответ, они смогут.