¿Cómo imprimo líneas para la primera aparición de un valor único en un archivo de 2 columnas?

¿Cómo imprimo líneas para la primera aparición de un valor único en un archivo de 2 columnas?

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:

  1. ver si la primera columna existe en la "base de datos"
  2. 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 sorttienen 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

información relacionada