Tengo un pequeño fragmento de un archivo con el que estoy trabajando:
ENSDARG00000032737 ENSDARP00000120731
ENSDARG00000032737 ENSDARP00000049290
ENSDARG00000061051 ENSDARP00000081062
ENSDARG00000061051
ENSDARG00000061051 ENSDARP00000129708
Sólo quiero imprimir la primera instancia de cada valor único en la primera columna y el valor correspondiente en la segunda columna, por lo que mi resultado deseado sería:
ENSDARG00000032737 ENSDARP00000120731
ENSDARG00000061051 ENSDARP00000081062
¿Existe una forma sencilla de lograr esto con awk o uniq o algo similar?
Cualquier ayuda sería apreciada.
Respuesta1
AWK POSIX:
m1[$1] == 0 {
m1[$1] = 1
print
}
Para cada línea:
- ver si la primera columna existe en la "base de datos"
- si no, agréguelo a la "base de datos" e imprima la línea completa
Respuesta2
$ sort -s -k1,1 -u file
ENSDARG00000032737 ENSDARP00000120731
ENSDARG00000061051 ENSDARP00000081062
Esto ordena el archivo basándose únicamente en la primera columna. Al hacerlo, ignora las líneas cuya primera columna ya se ha visto.
La mayoría de las implementaciones sort
tienen una opción no estándar -s
(utilizada en el comando anterior) que garantiza que utilizará un algoritmo de clasificación "estable". Un algoritmo de clasificación estable no cambia el orden de las entradas que tienen claves idénticas (primera columna en su caso).
Sin embargo, tenga en cuenta que la transcripción más larga (en la que tanto Ensembl como Havana están de acuerdo al 100%) para elENSDARG00000032737El gen es ENSDART00000049291, que codifica ENSDARP00000049290, no ENSDARP00000120731. Pero eso no es realmente asunto mío.
Respuesta3
Esta solución idiomática funcionará de manera sólida usando cualquier awk en cualquier shell en cada caja UNIX:
$ awk '!seen[$1]++' file
ENSDARG00000032737 ENSDARP00000120731
ENSDARG00000061051 ENSDARP00000081062
Respuesta4
Las mejores soluciones ya se han proporcionado simplemente publicando mi intento.
for i in `awk '{if(!seen[$1]++)print $1}' filename`; do sed -n '/'$i'/{p;q}' filename; done
producción
ENSDARG00000032737 ENSDARP00000120731
ENSDARG00000061051 ENSDARP00000081062