Как я могу написать совпадающие строки между двумя файлами, а также строку, которая следует за совпадением - PullRequest
0 голосов
/ 12 марта 2019

У меня есть два файла fastq, которые я хочу сравнить.Структура файлов fastq следующая ( на чтение ):

  • Строка 1 = заголовок, содержащий идентификатор чтения.Эта строка всегда начинается с «@».
  • Строка 2 = последовательность оснований для данного конкретного чтения (A, G, C или T)
  • Строки 3 и 4 = Содержат информацию о показателе качества для чтения, которое я неt потребность.

Два файла, с которыми я работаю:

  • File1 = Содержит конкретные последовательности интересующих меня баз, а также соответствующие имстроки заголовка ( 2 строки на чтение )

  • File2 = обычный файл fastq для сравнения ( 4 строки на чтение )

Мне нужно сравнить файлы 1 и 2, чтобы найти все совпадающие строки заголовка, а затем сохранить соответствующие строки последовательности из файла 2.

Где файл 1:

@HWI-D00461:137:C9H2FACXX:3:1101:1239:1968 1:N:0:GGCTAC
NTGTGTAATAGATTTTACTTTTGCCTTTAAGCCCAAGGTCCTGGACTTGAAACATCCAAGGGATGGAAAATGCCGTATAACAGGGTGGAAGAGAGATTTGA
@HWI-D00461:137:C9H2FACXX:3:1101:1117:1968 1:N:0:GGCTAC
NAAAGTCTACCAATTATACTTAGTGTGAAGAGGTGGGAGTTAAATATGACTTCCATTAATAGTTTCATTGTTTGGAAAACAGAGGTAATTTTTGATACAGA
@HWI-D00461:137:C9H2FACXX:3:1101:1087:1973 1:N:0:GGCTAC
NTAATCCAACTAACTAAAAATAAAAAGATTCAAATAGGTACAGAAAACAATGAAGGTGTAGAGGTGAGAAATCAACAGGATGTTCAGAAGCCTGTGTATGA

И файл 2:

@HWI-D00461:137:C9H2FACXX:3:1101:1239:1968 1:N:0:GGCTAC
NTGTGTAATAGATTTTACTTTTGCCTTTAAGCCCAAGGTCCTGGACTTGAAACATCCAAGGGATGGAAAATGCCGTATAACAGGGTGGAAGAGAGATTTGN
+
#1=BDDFFHHHFHIJJJJJJJJJJJJJJJJJJJJJIJJIJJJJJHJIIJHGIJJJJJJIHJJBGHJHIIJJJHHHHFFFFEEEDD;?BACDDDA?@CDDDC
@HWI-D00461:137:C9H2FACXX:3:1101:1117:1968 1:N:0:GGCTAC
NAAAGTCTACCAATTATACTTAGTGTGAAGAGGTGGGAGTTAAATATGACTTCCATTAATAGTTTCATTGTTTGGAAAACAGAGGTAATTTTTGATACNNN
+
#1=DDDFDFHHHGHIIGJJJJHIJIHHDIHHIJGGEI@GFGHIHIJHEFHIIIIGIJGHHGECFGIDHGIHIIEGIIJHHEEFFF7?ACEECCBBDEDDDC
@HWI-D00461:137:C9H2FACXX:3:1101:1200:1972 1:N:0:GGCTAC
NTACGTTTAGTAGAGACAGTGTCTTGCTATGTTGCCCAGGCTGGTCTCAAACTCCTGAGCTCTAGCAAGCCTTCCACCTCTGCCTCCCAGTGTTCTGGGAT
+
#1=DDDDFHHHBHGIGIIJHCDHHIJJJHEGFIIHFHGEGHJEIFHHHEFHHGIGIJEHIIJJJJIJIJIJGIIH.?CEFFFFDCEDD3>>@CDDDDDD<@

Другими словами, для каждой совпадающей строки заголовка я хочу сохранить его строку последовательности с партнером.

Наконец, я хочу записать все эти заголовки и последовательности в новый файл для последующего анализа.

Мой текущий вывод:

@HWI-D00461:137:C9H2FACXX:3:1101:1357:1984 1:N:0:GGCTAC
@HWI-D00461:137:C9H2FACXX:3:1101:1755:2000 1:N:0:GGCTAC
@HWI-D00461:137:C9H2FACXX:3:1101:1260:1977 1:N:0:GGCTAC
@HWI-D00461:137:C9H2FACXX:3:1101:1917:1984 1:N:0:GGCTAC

Мой желаемый вывод будет:

@HWI-D00461:137:C9H2FACXX:3:1101:1239:1968 1:N:0:GGCTAC
NTGTGTAATAGATTTTACTTTTGCCTTTAAGCCCAAGGTCCTGGACTTGAAACATCCAAGGGATGGAAAATGCCGTATAACAGGGTGGAAGAGAGATTTGA
@HWI-D00461:137:C9H2FACXX:3:1101:1117:1968 1:N:0:GGCTAC
NAAAGTCTACCAATTATACTTAGTGTGAAGAGGTGGGAGTTAAATATGACTTCCATTAATAGTTTCATTGTTTGGAAAACAGAGGTAATTTTTGATACAGA
@HWI-D00461:137:C9H2FACXX:3:1101:1087:1973 1:N:0:GGCTAC
NTAATCCAACTAACTAAAAATAAAAAGATTCAAATAGGTACAGAAAACAATGAAGGTGTAGAGGTGAGAAATCAACAGGATGTTCAGAAGCCTGTGTATGA

Вот что у меня есть.

ids = ''
with open(no_adapter_file, 'r') as file1:
    with open(comparison_file, 'r') as file2:
        common = set(file1).intersection(file2)
        for line in common:
            if line[0] == '@'
                ids += line

with open(comparison_file, 'r') as file2:
    ids_seq = ''
    for line in file2:
        if line == ids:
            line += ids_seq

with open(new_file, 'w') as file_out:
    for line in ids_seq:
        file_out.write(line)
print(new_file + " was created.")

Код успешно извлекает все совпадающие строки заголовка, но я не знаю, как извлечь строки последовательности, которые следуют.

РЕДАКТИРОВАТЬ: Добавлены некоторые примеры ввода и ожидаемого вывода.

1 Ответ

1 голос
/ 12 марта 2019

Есть несколько способов решения вашей проблемы.Это тот, который не предполагает ничего о сортировке файлов (что может быть весьма полезно, чтобы избежать потенциально высокого потребления памяти).Он также не предполагает ничего о возможности иметь дубликаты идентификаторов (что также может уменьшить объем памяти, если не гарантируется, что чтения будут в одном и том же порядке).

# First, get the IDs we are interested in
ids = set()
with open(no_adapter_file, 'r') as file1:
    line_number = 0
    for line in file1:
        line_number += 1
        if line_number % 2 == 1:
            ids.add(line.rstrip())

# Now, read the second file and print desired info if the ID is
# one of the interesting ones
with open(comparison_file, 'r') as file2, open(new_file, 'w') as file_out:
    line_number = 0
    for line in file2:
        line_number += 1
        if line_number % 4 == 1:
            candidate_id = line.rstrip()
        elif line_number % 4 == 2:
            candidate_seq = line.rstrip()
            if candidate_id in ids:
                file_out.write("{}\n{}\n".format(candidate_id, candidate_seq))

print(new_file + " was created.")

В этом коде мы сначала читаемпервый файл и хранить идентификаторы в наборе.Затем этот набор используется для проверки необходимости записи операций чтения из второго файла.

...