В вашем вводе нет двоеточий (:
), поэтому $1
относится ко всей строке, а ($1-1)
& ($2+2)
будут -1
и 2
соответственно, что означает ваш for
цикл всегда будет выполняться ровно четыре раза (для значений i
, равных -1
, 0
, 1
, затем 2
).
Внутри цикла for
вы 'чтобы убедиться, что a[i]
существует (это a[-1]
, a[0]
, a[1]
и a[2]
).
В последней части вашего кода печатается проверяемая строка в это время (но неиз первого файла благодаря next
в предыдущем разделе) всякий раз, когда массив a
содержит запись для номера строки этого файла.Поэтому он печатает строки 1 и 2 из каждого ввода (поскольку a[FNR]
существует для FNR
, равного 1 или 2).
Поскольку вам нужен приблизительный ответ и, следовательно, необходимо использовать agrep
, идеяпредложенный ответ Джеймса Брауна на ваш другой вопрос имеет смысл, но его реализация (как рассмотрено выше) - нет.
В следующем решении хиты agrep
используются в качестве сигналов для окружающих строкпечатать вместе с попаданиями (agrep
не поддерживает строки контекста, такие как grep
* -A NUM
и -B num
, иначе мы могли бы сделать agrep -A1 -B2 -1 -n PATTERN example.fastq
для более простого ответа).
agrep -1 "GAAATAATA" example.fastq | awk '
NR == FNR { agrep_hit[$0] = 1; next }
agrep_hit[$0] { print last_line; i = 1 }
0 < i && i < 4 { i++; print }
{ last_line = $0 }
' - example.fastq
Это проверяет входной файл дважды.Первый раз использует agrep
для нахождения приблизительного соответствия шаблону, а второй использует awk
для получения запрошенных строк контекста.
Когда общий номер строки в awk
(NR
) равенномер строки локального файла (FNR
), это означает, что мы проверяем первый ввод (-
, стандартный ввод, который является выводом agrep
).Мы сохраняем приблизительные совпадения паттернов в ассоциативном массиве для последующего использования, а затем переходим на следующую строку с next
(поэтому остальные команды awk
работают только на более поздних входах).
Поскольку вам нужнопредыдущая строка, мы должны напечатать это явно.Последняя строка кода awk
сохраняет текущую строку как last_line
, поэтому мы можем получить ее позже.На строке, которая была выведена с помощью agrep
(и, таким образом, сохранена в нашем массиве), мы печатаем сохраненную last_line
и устанавливаем итератор i
на 1
.
Когда i
равен 1
, 2
или 3
, мы увеличиваем его и печатаем текущую строку.Это печатает соответствующую строку, а затем еще две для контекста.