Оболочка: скрипт для группировки строк по подстроке

#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;
  

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