Suchen Sie eine Zeile in VI, die etwas anderes als ATCG enthält

7

Ich habe eine Datei mit Genomdaten, die ungefähr 5 Millionen Zeilen lang ist und nur die Zeichen A, T, C und G enthalten sollte. Das Problem ist, ich weiß, wie groß die Datei sein sollte, aber sie ist etwas größer. Das heißt, bei einer Analyse ist ein Fehler aufgetreten, oder es gibt Zeilen, die etwas anderes als genomische Daten enthalten.

Gibt es eine Möglichkeit, eine Linie zu finden, die etwas anderes als A, T, C oder G hat? Aufgrund der Art der Datei sollten keine anderen Buchstaben, Leerzeichen, Zahlen und Symbole vorhanden sein. Ich habe Symbol für Symbol gesucht und gehofft, dass es einen einfacheren Weg gibt.

mah
quelle
8
Muss es unbedingt in vi sein? Vielleicht funktioniert auch grep -e "[^ ATCG]"?
Panki
Ist jede wie eine Spalte oder vier Spalten mit A, T, C und G in beliebiger Reihenfolge?
RonJohn

Antworten:

19

Zunächst möchten Sie die Datei definitiv nicht in einem Editor öffnen (sie ist viel zu groß, um sie auf diese Weise zu bearbeiten).

Stattdessen, wenn Sie nur wollen , identifizieren , ob die Datei etwas anderes als enthält A, T, Cund Gkann tun, dass mit

grep '[^ATCG]' filename

Dies würde alle Zeilen zurückgeben, die etwas anderes als diese vier Zeichen enthalten.

Wenn Sie diese Zeichen aus der Datei löschen möchten , können Sie dies mit tun

tr -c -d 'ATCG\n' <filename >newfilename

(ob dies der richtige Weg ist, um die Datei zu "korrigieren" oder nicht, weiß ich nicht)

Dies würde alle Zeichen in der Datei entfernen, die nicht zu den vier gehören, und es würde auch newlines ( \n) beibehalten . Die bearbeitete Datei wird in geschrieben newfilename.

Wenn es sich um einen systematischen Fehler handelt, der der Datei etwas hinzugefügt hat, kann dies möglicherweise durch sedoder korrigiert werden awk, aber wir wissen noch nicht, wie Ihre Daten aussehen.


Wenn Sie die Datei in vioder geöffnet haben vim, dann den Befehl

/[^ATCG]

wird das nächste Zeichen im Bearbeitungspuffer finden , die keine ist A, T, Coder G.

Und :%s/[^ATCG]//gwird sie alle entfernen.

Kusalananda
quelle
2
Das Argument --line-number( -n) zu grep könnte aus offensichtlichen Gründen nützlich sein
Roman Odaisky
Sucht nicht grep '[^ATCG]'nur nach A, T, C & G in der ersten Spalte ?
RonJohn
@RonJohn Nein. Das ^hat eine ganz andere Bedeutung, wenn es als erstes Zeichen innerhalb auftritt [...](es negiert die Zeichenklasse).
Kusalananda
Ich wusste, ich hätte "nicht" hinzufügen sollen ... :) Sucht also grep '[^ATCG]'keine Zeile ohne A, T, C & G in der ersten Spalte ?
RonJohn
@RonJohn Nein . Es sucht nach Textzeilen , wo mindestens ein Zeichen ist nicht A, T, Coder G. Das [...]bedeutet "eines dieser Zeichen", und mit dem ^am Anfang dieser Gruppe bedeutet es "ein Zeichen, aber nicht eines davon".
Kusalananda
0

Ich habe mich auf den Titel konzentriert

Suchen Sie eine Zeile in VI, die etwas anderes als ATCG enthält

Und ich habe dies im VI-Editor getestet, dem sogenannten "Last-Line-Modus".

:%!tr -c -d 'ATCG\n

:Aktiviert den Befehlszeilenmodus, %stimmt die gesamte Datei als Bereich ab und !filtert diesen Bereich über einen externen Befehl tr -c -d 'ATCG\n, der zufällig mit dem von @Kusalananda geschriebenen übereinstimmt :).

Prosti
quelle