2015-06-17 16 views
5

Ich habe versucht, eine Möglichkeit zu finden, Zeilen zu wählen, die basierend auf den Werten von zwei Spalten eindeutig sind. Zum Beispiel, hier ist ein Beispiel/example meine Datei:Auswählen eindeutiger Zeilen basierend auf zwei Spalten

chr1 10 12 
chr1 10 12 
chr1 10 11 
chr1 9 12 
chr2 15 20 

Und das ist, was ich will meine Ausgabe aussehen:

chr1 10 12 
chr1 10 11 
chr1 9 12 
chr2 15 20 

Ich habe versucht, diesen Code zu verwenden, weil Ich mag wie es nicht mit der Reihenfolge meiner Datei durcheinander kommt:

awk -F"\t" '!_[$2]++' SNP_positions.txt > SNP_positions_uniq.txt 

Allerdings erfasst es nur einzigartige Merkmale einer Spalte. Gibt es eine Möglichkeit, dies zu bearbeiten, damit es für zwei Spalten funktioniert?

+0

Sie erwähnen zwei Spalten, aber es gibt drei in Ihrer Datei. Welche sollten berücksichtigt werden? Geben Sie nach Möglichkeit ein generischeres Beispiel an. Ihr derzeitiger Ansatz funktioniert für die angegebene Datei, daher kann es noch etwas anderes geben. – fedorqui

+0

Ich möchte Zeilen finden, die eindeutige Werte in Spalte zwei und drei haben. Wenn ich den obigen Code benutze, würde meine Ausgabe nicht die dritte Zeile in meiner Ausgabe ergeben (chr1 122332 130204). Ich werde es bearbeiten, um es einfacher zu machen – cosmictypist

+0

Wer auch immer Ihnen gesagt hat, '_' als variablen Namen zu verwenden, ist ein Idiot, hören Sie ihnen nicht mehr zu. Wir alle wissen, dass single-letter Variablennamen im Allgemeinen am besten vermieden werden, da sie nichts tun, um die Klarheit Ihres Codes zu verbessern, aber etwas zu verwenden, das nicht einmal ein Buchstabe ist, ist einfach lächerlich. –

Antwort

10

Sie können perfekt einen Index verwenden, die mehr als ein Feld für die Array-Elemente verwendet:

awk -F"\t" '!seen[$2, $3]++' file 

In diesem Fall verwenden wir $2, $3 als Index. Auf diese Weise erhalten wir alle verschiedenen Elemente der Tupel ($2, $3).

+0

Wenn ich das für alle drei Spalten verwenden wollte, würde der Code wie folgt aussehen: 'awk -F '\ t' '! uniq [$ 1 FS $ 3] ++' Datei 'oder' awk -F ' \ t "'! uniq [$ 1 FS $ 2 FS $ 3] ++' Datei'' – cosmictypist

+0

@ christylynn002 Wenn Sie die ganze Zeile verwenden wollen, ist es schneller' uniq [$ 0] 'zu sagen. Wenn Sie drei von mehr wollen, 'uniq [$ 1 FS $ 2 FS $ 3]'. Beachten Sie, dass wir 'FS' verwenden, um zu verhindern, dass' 2 \ tab3' zu einer Zeile passt, die '2 3' ist. – fedorqui

+0

Ah, perfekt. Vielen Dank! Ich denke ich verstehe es endlich. – cosmictypist

1

Die awk Lösung vorgesehen ist, groß und schnell, aber ich kam hier selbst für die sort Lösung suchen, die in fast allen Fällen wahrscheinlich langsamer ist:

cat file | sort -u -k1,1 -k2,2 -k3,3 -s 

ich die Antwort hier: https://stackoverflow.com/a/12546627/778533

Verwandte Themen