Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > *NIX системы: Общие вопросы > grep-нуть строки с числами


Автор: ksili 2.10.2012, 06:36
Есть файл, в котором каждая строка содержит 2 числа. Одно из них дата в формате unixtime. Например, 1349049600.
Вторые числа тоже целочисленные, но в другом диапазоне - не пересекаются с этим.

Мне нужно подсчитать количество строк с этой датой в определённом диапазоне. Например, от 1346457600 до 1349049600 или от 1346587200 до 1349179200. По-разному может быть, но диапазон как правило - месяц. 
Я считаю примерно так (для первого случая):
Код

grep -c -E '134(64|65|66|67|68|69|70|71|72|73|74|75|76|77|78|79|80|81|82|83|84|85|86|87|88|89|90)[0-9][0-9][0-9]00' /home/collector/current.txt


Опыта в этом мало, и я понимаю, что эта регулярка не идеальна. Есть в ней косяки.
Поэтому надеюсь мне помогут следующим. 
Во-первых, скажите нет ли в инете такого сервиса, в который вводишь этот диапазон в виде unixtime или в виде человеческих дат - а он выводит соответствующую регулярку для отбора таких unixtime.
Если такой сервис есть, то вопросов больше нет - дайте только адрес. А если нет, то покажите как бы вы грепали диапазоны указанных двух примеров.

Для преобразования дат из человеческого вида к unixtime и обратно использую этот конвертер: http://www.onlineconversion.com/unix_time.htm

Автор: krypt3r 2.10.2012, 07:23
Что-то типа
Код

$ awk '$0 > 1346457600 && $0 < 1349049600' file.txt

Автор: 586 2.10.2012, 08:06
Код
cat aa.txt | perl -ne '/134([0-9]{2})[0-9]{3}00/ && 64 <= $1 && $1 <= 90 && print'

Автор: ksili 2.10.2012, 09:48
Спасибо awk-ом получилось. Сделал так: 
Код

 gawk 'BEGIN {kol=0;} { if ( $2 > 1346587200 && $2 < 1349179200) kol++; } END {print kol;}' current


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)