2016-06-02 4 views
0

Ich habe eine ziemlich große Textdatei mit genetischen Daten (94.807.000 Zeilen). Ich möchte die Zeilen extrahieren, in denen bestimmte Muster in einer bestimmten Spalte vorkommen. Ich habe versucht, awk und grep auf verschiedene Arten zu verwenden, aber ich habe keinen Weg gefunden, den Job zu erledigen. Die Datei ist durch Leerzeichen getrennte und sieht wie folgt aus:Extrahieren Sie Linien mit mehreren Mustern in einer Spalte mit Hilfe von awk

V1  V2 V3 V4 V5  V6 
1: 10 179406 T . HPGM T,T,T,T 
2: 10 179407 T . HPGM T,T,T,T 
3: 10 179408 G . HPGM G,G,G,G 
4: 10 179409 A . HPGM A,A,A,A 
5: 10 179410 A . HPGM A,A,A,A 
6: 10 179411 T . HPGM T,T,T,T 

V5 und V6 kann mehr haben dann die vier Einträge hier angezeigt und alles könnte ziemlich komisch aussehen, wie:

V1  V2 V3 V4 V5     V6 
1: 1 158154514 A . HPGO A,AAAA..204..TTTT,A,A 

ich behalten wollen Die Zeilen Einträge für H und P (das sind die ersten beiden durch Komma getrennte Zeichen in V6) sind genau entweder A, C, T oder G, sollte also nur eines dieser vier Zeichen haben. H und P müssen jedoch nicht den gleichen Charakter haben. In V5 können mehrere Kombinationen auftreten, aber alle beginnen mit HP. Ich bin nicht interessiert, ob irgendwelche oder wie viele Einträge danach kommen und alle Zeilen haben Einträge für H und P, so dass ich mich nicht mit fehlenden Einträgen beschäftigen muss.

Ich habe einige Antworten gefunden, die zeigen, wie man mit logischem oder || nach mehreren Mustern sucht , einige, die zeigen, wie auch in einem bestimmten Bereich mit $6 ~ '/A,.' suchen und nach genauen Übereinstimmungen mit == "pattern" suchen. Ich fand jedoch keine Antworten für die Kombination dieser Dinge und konnte es nicht selbst herausfinden. Hilfe würde sehr geschätzt werden.

+0

Was halten Sie für einen "Eintrag für H und P". "V5" sieht wie "HPGM" oder "HPGO" aus, die als "Einträge für H und P" betrachtet werden? Und wie sagt man, ob diese H- und P-Einträge genau entweder A, C, T oder G sind? Wie können alle Werte in V6 nichts anderes als A-, C-, T- oder G-Werte enthalten? Ich denke, die Logik macht für Sie vollkommen Sinn, aber es wird nicht auf eine Weise erklärt, dass jemand, der mit dieser genetischen Datendatei nicht vertraut ist, verstehen wird. – JNevill

+0

Entschuldigung wegen Unklarheit. Einträge für H und P sind die ersten zwei Zeichen in Spalte V6. Im oberen Fall (6 Reihen) sieht alles gut aus. Im Kleinbuchstaben (1 Zeile) lautet der Eintrag für P jedoch "AAAA..204..TTTT" - diese Zeilen sollten ausgeschlossen werden. In 'V5' können mehrere Kombinationen vorkommen, aber alle beginnen mit' HP'. Am Ende sollten alle Reihen ungefähr wie die 6 Reihen oben aussehen. Ich möchte nur Zeilen ausschließen, die witzige Sachen haben, wie zum Beispiel die 'AAAA..204..TTTT'. Allgemeiner gesagt, sollten die ersten zwei durch Komma getrennten Stellen in V6 ** genau ein ** Zeichen haben, das entweder A, C, T oder G ist. – AlexDeLarge

Antwort

1

können Sie diesen awk Befehl verwenden:

awk 'split($NF, a, /,/) && a[1] a[2] ~ /^[ACTG]{2}$/' file 

1: 10 179406 T . HPGM T,T,T,T 
2: 10 179407 T . HPGM T,T,T,T 
3: 10 179408 G . HPGM G,G,G,G 
4: 10 179409 A . HPGM A,A,A,A 
5: 10 179410 A . HPGM A,A,A,A 
6: 10 179411 T . HPGM T,T,T,T 
  • split($NF, a, /,/) spalten letzte Spalte durch Komma
  • a[1] a[2] ~ /^[ACTG]{2}$/ einen regulären Ausdruck wird mit ersten und zweiten Teilfeldern nach Split, um sicherzustellen, ist eine der A or C or T or G
+1

Vielen Dank. Das hat perfekt funktioniert! – AlexDeLarge

Verwandte Themen