Shell: скрипт для группировки строк по подстроке - PullRequest
0 голосов
/ 24 мая 2011

У меня есть программа (извините, изменяю, что это не вариант), которая выводит файлы журнала с количеством строк более 500 тыс.

Я пытаюсь сгруппировать строки (а затем отсортировать эти группы) в журналефайл, основанный на подстроке со строками

Например, у меня есть строки, подобные приведенным ниже:

SELECT something WHERE TIM BETWEEN '*' AND '*' AND something;

, что я собираюсь сгруппировать, это TIM BETWEEN '*' AND '*', где * соответствует между строкамипример:

SELECT something WHERE TIM BETWEEN '2010-03-04' AND '2010-03-10' AND something;
SELECT something WHERE TIM BETWEEN '2011-01-28' AND '2011-02-05' AND something;
SELECT something WHERE TIM BETWEEN '2010-03-04' AND '2010-03-10' AND something;
SELECT something WHERE TIM BETWEEN '2011-01-28' AND '2011-02-05' AND something;

будет сгруппирован как таковой в выходных данных:

SELECT something WHERE TIM BETWEEN '2010-03-04' AND '2010-03-10' AND something;
SELECT something WHERE TIM BETWEEN '2010-03-04' AND '2010-03-10' AND something;
SELECT something WHERE TIM BETWEEN '2011-01-28' AND '2011-02-05' AND something;
SELECT something WHERE TIM BETWEEN '2011-01-28' AND '2011-02-05' AND something;

, причем каждая группа также будет отсортирована на основе всей строки, так что где "что-то" похожерядом друг с другом?

Я пытался собрать сценарий оболочки для вывода того, что я хочу прочитать из файла журнала, но безуспешно!

Редактировать: Мне нужнотакже упомянуть, что «что-то» может быть несколькими словами, например:

SELECT blah1, blah2 or SELECT blah1, blah2, blah3

Ответы [ 2 ]

1 голос
/ 24 мая 2011

Возможно, вы сможете использовать sort

sort -o outputfile +1 -2 +4 -5 +6 -7 inputfile

Где +1 -2 дает столбец «что-то», +4 -5 - первый столбец даты, а +6 -7 - последний столбец даты.

(PS! Не тестировался)

0 голосов
/ 24 мая 2011

Вам придется предварительно отфильтровать ваши данные и превратить их в то, что вы можете использовать sort с.

awk '{sub(/BETWEEN/, "|",$0) ;sub(/AND/,"|",$0)}' logFile \
| sort -t"|" +1 -2 +2 -3 \
| sed 's/|/BETWEEN/;s/|/AND/'

выход

SELECT something WHERE TIM BETWEEN '2010-03-04' AND '2010-03-10' AND something;
SELECT something WHERE TIM BETWEEN '2010-03-04' AND '2010-03-10' AND something;
SELECT something WHERE TIM BETWEEN '2011-01-28' AND '2011-02-05' AND something;
SELECT something WHERE TIM BETWEEN '2011-01-28' AND '2011-02-05' AND something;

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...