2015-06-17 17 views
5

Ho cercato di individuare un modo per selezionare linee univoche in base ai valori di due colonne. Ad esempio, ecco un campione/esempio di mio file:Selezione di linee univoche basate su due colonne

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

E questo è ciò che voglio la mia uscita a guardare come:

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

Ho cercato di utilizzare questo codice, perché mi piace come lo fa non si scherza con l'ordine del mio file:

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

Tuttavia, si coglie solo caratteristiche uniche di una colonna. C'è un modo per modificare questo per farlo funzionare per due colonne?

+0

hai citato due colonne ma ce ne sono tre nel tuo file. Quali dovrebbero essere considerati? Fornisci un esempio più generico, se possibile. Il tuo attuale approccio funziona per il file dato, quindi potrebbe esserci qualcos'altro. – fedorqui

+0

Voglio trovare linee che abbiano valori univoci in entrambe le colonne due e tre. Se avessi usato il codice sopra la mia uscita non mi avrebbe dato la 3a riga nella mia uscita (chr1 122332 130204). Modificherò per renderlo più semplice – cosmictypist

+0

Chiunque ti abbia detto di usare '_' come nome di variabile è un idiota, non ascoltarli più. Sappiamo tutti che i nomi delle variabili a lettera singola sono meglio evitati in generale, poiché non fanno nulla per migliorare la chiarezza del codice, ma l'uso di qualcosa che non è nemmeno una lettera è semplicemente ridicolo. –

risposta

10

È perfettamente possibile utilizzare un indice che utilizza più di un campo per gli elementi dell'array:

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

In questo caso si usa $2, $3 come indice. In questo modo, otterremo tutti gli elementi diversi delle tuple ($2, $3).

+0

Se volessi usare questo per tutte e tre le colonne, il codice sarebbe simile a questo: 'awk -F" \ t "'! uniq [$ 1 FS $ 3] ++' file' o' awk -F " \ t "'! uniq [$ 1 FS $ 2 FS $ 3] ++' file'' – cosmictypist

+0

@ christylynn002 Se si desidera utilizzare la riga intera, è più veloce pronunciare' uniq [$ 0] '. Se ne vuoi tre di più, 'uniq [$ 1 FS $ 2 FS $ 3]'. Nota usiamo 'FS' per evitare che' 2 \ tab3' corrisponda a una linea '2 3'. – fedorqui

+0

Ah, perfetto. Grazie! Penso di averlo finalmente capito. – cosmictypist

1

La soluzione awk fornito è grande e veloce, ma sono venuto qui me stesso cercando la soluzione sort, che è probabilmente più lento in quasi tutti i casi:

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

ho trovato la risposta qui: https://stackoverflow.com/a/12546627/778533

Problemi correlati