Awk — Построчное Сравнение Двух Файлов, И Если Шаблон Файла 1 Не Найден (Полностью Или Частично) В Файле 2, Напечатайте Строку Файла 1.

  • Автор темы Ilschat
  • Обновлено
  • 20, Oct 2024
  • #1

У меня есть два файла:

файл1 (поиск):

 
 
 
 
 awk 'NR==FNR{a[$1]++;next} !($1 in a) {print $1} {next}' file2 file1
 

файл2 (шаблоны):

awk 'FN==NR {exclude[$0];next} !($0 in exclude)' file2 file1

Что мне нужно:

1 GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCGTAAAGTTTTTTTTT 2 3 4 GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCCGTCCGTAG

Это значит, что мне нужен скрипт, который ищет мои строки поиска в файле шаблонов, и если строки поиска можно найти полностью или частично (как для строки после "2"), то их не надо писать, а все остальные строки файла 1.

Я попробовал множество скриптов grep и awk, найденных на этом форуме, но ни один из них не дал того, что мне нужно, например.

GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCGTAAAGC GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCGTAAAGCG GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCGTAAAGCGTCC GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCGTAAAGCGTCCGTAG

или

1 GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCGTAAAGTTTTTTTTT 2 GACGGAGGATGCAAGTGTTATCCGGAAT 3 GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCGTAAAGCGTCC 4 GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCCGTCCGTAG

Я также попробовал grep.

В любом случае, все опробованные скрипты просто находят полностью совпадающие шаблоны, а не частично совпадающие...

Есть у кого-нибудь идеи??

#awk #grep #биоинформатика #сравнение файлов #сопоставление с образцом

Ilschat


Рег
13 Jul, 2011

Тем
66

Постов
189

Баллов
529
  • 25, Oct 2024
  • #2

Используя

 
 
 NR == FNR       { seq[++n] = $1; next }

{

header = $0

getline

found = 0

for (i = 1; i <= n; ++i) {

if (match(seq[i], $0) > 0) {

found = 1

break

}

}

print header

if (!found) print
}
 
script:

file1

Запускаем его:

file1

Скрипт сначала считывает 2000 последовательностей из file1 into the array seq , а затем читает заголовок из getline followed by the sequence from file1 (с использованием file1 ). It then goes through the array seq чтобы найти последовательность, содержащую текущую последовательность из file2 . If such a sequence is found, the header is printed and the script continues with the next line in $ awk -f script.awk file2 file1 1 GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCGTAAAGTTTTTTTTT 2 3 4 GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCCGTCCGTAG . В противном случае печатаются и заголовок, и последовательность.

Скрипт предполагает, что NR == FNR { seq[++n] = $1; next } { header = $0 getline for (i = 1; i <= n; ++i) { if (match(seq[i], $0) > 0) { print header next } } print header print } contains alternating header and sequence lines, and absolutely no multi-line sequence.

Ниже приведен тот же сценарий, но с использованием принципа DRY («Не повторяйтесь»):

awk
 

Vn_


Рег
09 Jan, 2009

Тем
62

Постов
187

Баллов
507
  • 25, Oct 2024
  • #3

 
 1
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCGTAAAGTTTTTTTTT
2
3
4
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCCGTCCGTAG
 
+ m решение:

grep
  • cmd - crucial awk '/^[^>0-9]/{ m = ""; cmd = sprintf("grep -m1 %s file2", $0); cmd | getline m; close(cmd); if (m) next; }1' file1 команда
  • grep - variable filled with possible matched item

Вывод:

awk
 

Ttc244skestSoky


Рег
07 Apr, 2020

Тем
88

Постов
205

Баллов
675
  • 25, Oct 2024
  • #4
 
 
 
 1
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCGTAAAGTTTTTTTTT
2
3
4
GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCCGTCCGTAG
 

файл_1

GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCGTAAAGC GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCGTAAAGCG GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCGTAAAGCGTCC GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCGTAAAGCGTCCGTAG

файл_2

1 GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCGTAAAGTTTTTTTTT 2 GACGGAGGATGCAAGTGTTATCCGGAAT 3 GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCGTAAAGCGTCC 4 GACGGAGGATGCAAGTGTTATCCGGAATCACTGGGCCGTCCGTAG

Выход

grep -vxf <(grep -of file_1 file_2 | sort -u) file_1
 

Ogaib


Рег
24 Jul, 2004

Тем
74

Постов
192

Баллов
592
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно