Моя проблема в том, что у меня очень большая база данных (10 ГБ), и я хочу сэкономить как можно больше времени, просматривая ее.У меня есть оператор awk
, который выполняет поиск в базе данных и, в зависимости от шаблона, записывает данные в другой файл.
У меня есть входной файл, который будет введен в мой скрипт в качестве переменной аргумента терминала.Внутри него есть несколько строк данных, которые будут использоваться в качестве шаблона для оператора * 1003. *
В базе данных все строки, соответствующие шаблону, отсортированы рядом друг с другом, поэтому, по сути, после печати,нет необходимости искать дальше в базе данных, потому что все уже найдено.Как только awk
находит первую строку сопоставления с образцом, все остальные строки сопоставления с образцом располагаются последовательно после нее.
Эту проблему трудно объяснить только словами, поэтому я создал несколько примеров того, что мойфайлы, код и база данных выглядят и работают следующим образом.
Входной файл через терминал выглядит следующим образом:
group_1
group_2
group_3
...
База данных 10 ГБ выглядит следующим образом:
group_1 DATA ...
group_1 DATA ...
group_1 DATA ...
group_2 DATA ...
group_2 DATA ...
group_2 DATA ...
group_2 DATA ...
group_3 DATA ...
group_3 DATA ...
group_3 DATA ...
group_3 DATA ...
...
Код сценария с рассматриваемым оператором awk
выглядит следующим образом:
IFS=$'\n'
set -f
for var in $(cat < "$1")
do
awk -v seq="$var" '{if (match($1, seq)) {print $0}}' filepath/database > pattern_matched.file
done
краткое объяснение того, что делает этот код, состоит в том, что он принимает переменную аргумента Terminal, в данном случае имя файлаи открывает его для for loop
, чтобы начать цикл.например, шаблон group_1
помещается в var
, и начинается поиск в базе данных.Если первый столбец соответствует шаблону, он сохраняет строку в файле pattern_matched.file
file.
В настоящее время он просматривает все данные объемом 10 ГБ и печатает данные в файл, как и предполагалось, но тратит впустуюмного времени.После печати строк, соответствующих шаблону, я хочу остановить awk
от продолжения поиска в базе данных и перейти к следующему шаблону из входного файла.Примером поведения для group_2
будет awk
, проверяющий первые 3 строки базы данных и обнаруживающий, что ни одна из строк не имеет соответствующего шаблона.Однако строка 4 содержит шаблон, поэтому печатает строку и последующие строки, соответствующие шаблону, после него.Когда awk
достигает строки 8, он выходит из оператора awk
, и for loop
может затем переходить к следующему шаблону для поиска, group_3
.
awk '{print $0; exit}' filename
Что-то подобное происходитне работает, так как он печатает только первый экземпляр и выходит из строя, я хочу что-то, что может напечатать все совпадения, и как только он найдет следующее совпадение не по шаблону, он выйдет из строя.
Заранее спасибо.
ОБНОВЛЕНИЕ: текущая проблема заключается в том, что приведенное ниже решение имеет логический смысл.Если он входит в оператор if, он выводит строку в файл и переходит к следующей строке.Если строка не совпадает, она вводит оператор else-if и завершает работу awk
.Это имеет большой смысл для меня, но по какой-то причине, когда переменная flag
была установлена в 1 оператором if для первой совпавшей строки, она входит в оператор else-if.Поскольку условие else-if оценивается как true, оно завершается еще до сканирования следующей строки.Я подтвердил это поведение с помощью операторов print везде в операторе awk
.Это мой код с оператором печати:
awk -v seq="$seqid" '{if(match($1, seq)) {print "matched" ; print $1 ; flag=1} else if (flag) {print "not matched" ; exit}}'
, который выводит это: странное поведение