2016-06-28 1 views
0

у меня есть два файла, которые выглядят так:Удалить ОНП с неправильными аллелями

  1. Эталонный панель (ReferencePanel.csv)

    "id","position","allele0","allele1","allele1_frequency" 
    "seq-rs1010355",55102179,"T","C",0.098 
    "seq-rs272408",55103603,"C","T",0.787 
    "seq-rs11669899",55104559,"A","T",0.029 
    "imm_19_59798585",55106773,"A","G",0.499 
    
  2. BIM файл (myfile.bim)

    19 19:55102179 0 55102179 C T 
    19 19:55103603 0 55103603 C T 
    19 19:55104559 0 55104559 G C 
    19 19:55106773 0 55106773 A T 
    

Я хотел бы удалить в файле BIM все строки, в которых два аллеля отличаются от контрольной панели. Другими словами, я хотел бы сохранить только строки, которые имеют точно такие же аллели, что и эталонная панель - порядок не имеет значения.

ПРИМЕР:

Ссылка аллель:

"seq-rs1010355",55102179,"T","C",0.098 
"seq-rs272408",55103603,"C","T",0.787 
"seq-rs11669899",55104559,"A","T",0.029 
"imm_19_59798585",55106773,"A","G",0.499 

БИМ файл (myfile.bim)

19 19:55102179 0 55102179 C T 
19 19:55103603 0 55103603 C T 
19 19:55104559 0 55104559 G C 
19 19:55106773 0 55106773 A T 

Keep только следующие строки:

19 19:55102179 0 55102179 C T 
19 19:55103603 0 55103603 C T 

мне удалось извлечь все позиции из контрольной панели, используя следующие строки:

#Create an empty list 
positions=[] 

#Populate list with positions 
for line in open("ReferencePanel.csv"): 
    columns = line.split(",") 
    positions.append(columns[1]) 
#Remove first element which corresponds to the header 
positions.pop(0) 

Но я застрял здесь. Я надеюсь, что кто-то может мне помочь. Спасибо заранее!

ответ

1

Если вы не против использования awk, вы можете использовать следующую команду:

awk -F'[",]*' 'NR==FNR && $4 && $5 {ref[$4][$5]=1} NR>FNR {FS=" *"} NR>FNR && ref[$6][$7]' reference.csv myfile.bim 

, который в результате:

19 19:55102179 0 55102179 C T 
19 19:55103603 0 55103603 C T 
19 19:55106773 0 55106773 A T 

Примечание последняя строка соответствует 4-й линии ссылки файл (с А, Т)

Пояснение:

-F'[",]*' сопрягает разделитель CSV для разбора эталонного файла

NR==FNR && $4 && $5 {ref[$4][$5]=1} становится все C, T, G, А от эталонного файла

NR>FNR {FS=" *"} меняется разделитель awk поля для пространств для разбора второй файл

NR>FNR && ref[$6][$7] является линией печати второго файла, если шестой и седьмой столбец соответствия, что хранились в массиве

+0

Спасибо за быстрый ответ Oliv. Я весьма признателен! Однако я получаю синтаксическую ошибку, используя эту команду. Я думаю, что есть что-то не так/нет между [$ 4] [$ 5], а также между [$ 6] [$ 7]. Более того, я не понимаю, почему вы используете столбцы 4 и 5 для ссылочного файла (я бы использовал 3 и 4) и 6 и 7 для второго файла (я бы использовал столбцы 5 и 6). – Svalf

+0

Я использую GNU Awk 4.1.3, и этот скрипт отлично работает, какова ваша версия? Сценарий использует индексы 4 и 5 для извлечения данных из ссылочного файла, поскольку разделитель '[',] *' также соответствует первому '' 'в начале строки, поэтому переменная awk' $ 1' пуста. – oliv

+0

Я подключаюсь к Linux из Mac OS X с помощью Terminal, и я использую версию 2.6.32-358.23.2.el6.x86_64 (gcc версия 4.4.7 20120313). – Svalf