Wie drucke ich Zeilen für das erste Auftreten eines eindeutigen Werts in einer zweispaltigen Datei?

Wie drucke ich Zeilen für das erste Auftreten eines eindeutigen Werts in einer zweispaltigen Datei?

Ich habe einen kleinen Ausschnitt einer Datei, mit der ich arbeite:

ENSDARG00000032737    ENSDARP00000120731
ENSDARG00000032737    ENSDARP00000049290
ENSDARG00000061051    ENSDARP00000081062
ENSDARG00000061051     
ENSDARG00000061051    ENSDARP00000129708

Ich möchte nur die erste Instanz jedes eindeutigen Werts in der ersten Spalte und den entsprechenden Wert in der zweiten Spalte drucken. Meine gewünschte Ausgabe wäre also:

ENSDARG00000032737    ENSDARP00000120731
ENSDARG00000061051    ENSDARP00000081062

Gibt es eine einfache Möglichkeit, dies mit awk oder uniq oder etwas Ähnlichem zu erreichen?

Jede Hilfe wäre willkommen.

Antwort1

POSIX AWK:

m1[$1] == 0 {
   m1[$1] = 1
   print
}

Für jede Zeile:

  1. prüfen, ob die erste Spalte in der „Datenbank“ existiert
  2. wenn nicht, zur „Datenbank“ hinzufügen und die gesamte Zeile drucken

Antwort2

$ sort -s -k1,1 -u file
ENSDARG00000032737    ENSDARP00000120731
ENSDARG00000061051    ENSDARP00000081062

Dadurch wird die Datei nur nach der ersten Spalte sortiert. Dabei werden Zeilen ignoriert, deren erste Spalte bereits angezeigt wurde.

Die meisten Implementierungen von sorthaben eine nicht standardmäßige -sOption (im obigen Befehl verwendet), die garantiert, dass ein „stabiler“ Sortieralgorithmus verwendet wird. Ein stabiler Sortieralgorithmus ändert die Reihenfolge von Einträgen mit identischen Schlüsseln (in Ihrem Fall die erste Spalte) nicht.


Beachten Sie jedoch, dass das längere Transkript (dem sowohl Ensembl als auch Havana zu 100 % zustimmen) für dieENSDARG00000032737Das Gen ist ENSDART00000049291, das für ENSDARP00000049290 kodiert, nicht für ENSDARP00000120731. Aber das geht mich eigentlich nichts an.

Antwort3

Diese idiomatische Lösung funktioniert zuverlässig mit jedem awk in jeder Shell auf jeder UNIX-Box:

$ awk '!seen[$1]++' file
ENSDARG00000032737    ENSDARP00000120731
ENSDARG00000061051    ENSDARP00000081062

Antwort4

Die besten Lösungen wurden bereits bereitgestellt, ich poste einfach meinen Versuch

for i in `awk '{if(!seen[$1]++)print $1}' filename`; do sed -n '/'$i'/{p;q}' filename; done

Ausgabe

ENSDARG00000032737    ENSDARP00000120731
ENSDARG00000061051    ENSDARP00000081062

verwandte Informationen