2016-06-28 7 views
0

ich zwei Dateien haben, die wie folgt aussehen:entfernen SNPs mit falschen Allele

  1. Die Referenzplatte (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. Eine BIM-Datei (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 
    

Ich möchte in der BIM-Datei alle Zeilen, in denen die beiden Allele von der Referenzplatte unterschiedlich sind zu löschen. Mit anderen Worten, ich möchte nur die Zeilen behalten, die genau dieselben Allele wie das Referenzfeld haben - die Reihenfolge spielt keine Rolle.

Beispiel:

Referenz-Allels:

"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 

BIM-Datei (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 

Behalten Sie nur die folgenden Zeilen:

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

habe ich es geschafft, alle Positionen von der Referenzplatte zu extrahieren mit folgenden Zeilen:

#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) 

Aber ich bin hier fest. Ich hoffe, dass mir jemand helfen kann. Vielen Dank im Voraus!

Antwort

1

Wenn Sie nicht gegen die Verwendung von awk sind, können Sie den folgenden Befehl verwenden:

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

die sie ergeb:

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

Beachten Sie die letzte Zeile entspricht die 4. Zeile der Referenz Datei (mit A, T)

Erläuterung:

-F'[",]*' zum Parsen der Referenzdatei des CSV delimiter passenden

NR==FNR && $4 && $5 {ref[$4][$5]=1} wird immer alle C, T, G, A von der Referenzdatei

NR>FNR {FS=" *"} wird das awk Feldseparator zum Räumen Ändern der zweiten parsen Datei

NR>FNR && ref[$6][$7] ist Druckzeile der zweiten Datei, wenn die 6. und 7. Spalte ist passend, was in dem Array gespeichert wurde

+0

Vielen Dank für Ihre schnelle Antwort Oliv. Ich schätze wirklich! Ich bekomme jedoch einen Syntaxfehler mit diesem Befehl. Ich denke, da ist etwas falsch/fehlt zwischen [$ 4] [$ 5], und dasselbe zwischen [$ 6] [$ 7]. Außerdem verstehe ich nicht, warum Sie die Spalten 4 und 5 für die Referenzdatei verwenden (ich würde 3 und 4 verwenden) und 6 und 7 für die zweite Datei (ich würde Spalten 5 und 6 verwenden). – Svalf

+0

Ich benutze GNU Awk 4.1.3 und das Skript funktioniert gut, was ist Ihre Version? Das Skript verwendet Index 4 und 5 zum Extrahieren von Daten aus der Referenzdatei, da das Trennzeichen '[',] *' auch mit dem ersten '' 'am Anfang der Zeile übereinstimmt und die awk-Variable' $ 1' leer ist. – oliv

+0

Ich bin eine Verbindung zu Linux von Mac OS X mit Terminal, und ich verwende Version 2.6.32-358.23.2.el6.x86_64 (GCC-Version 4.4.7 20120313). – Svalf