#regex #shell #scripting #string-matching
#регулярное выражение #оболочка #написание #сопоставление строк
Вопрос:
У меня есть программа (извините, что изменить это невозможно), которая выводит файлы журналов, содержащие более 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
Ответ №1:
Вероятно, вы сможете использовать сортировку
sort -o outputfile 1 -2 4 -5 6 -7 inputfile
Где 1 -2 дает столбец «что-то», 4 -5 дает первый столбец даты и 6 -7 дает последний столбец даты.
(PS! Не тестировался)
Комментарии:
1. спасибо Кристоферу за ответ, но я не могу полагаться на то, что количество столбцов и положение времени Между блоками ‘ ‘ И ‘ ‘ находятся в одинаковых позициях между строками, я отредактировал исходный вопрос, чтобы отразить это
2. Вы можете установить «разделитель» на что-то другое, кроме пробела, чтобы определить, чем заканчивается столбец. Делая это, вы, вероятно, могли бы выполнить многоступенчатую сортировку, где вы меняете разделитель между каждой сортировкой (если в качестве разделителя можно использовать слова, которые есть). -t<разделитель> изменяет разделитель.
Ответ №2:
Вам придется предварительно отфильтровать свои данные и превратить их во что-то, с чем вы сможете использовать 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;
Я надеюсь, это поможет.