2列ファイルに最初に表示される固有値を印刷するには?

2列ファイルに最初に表示される固有値を印刷するには?

私が使用しているファイルの小さな部分があります。

ENSDARG00000032737    ENSDARP00000120731
ENSDARG00000032737    ENSDARP00000049290
ENSDARG00000061051    ENSDARP00000081062
ENSDARG00000061051     
ENSDARG00000061051    ENSDARP00000129708

最初の列に各固有値の最初のインスタンスを印刷し、2番目の列にその値を印刷したいので、希望の出力は次のようになります。

ENSDARG00000032737    ENSDARP00000120731
ENSDARG00000061051    ENSDARP00000081062

awkやuniqなどを使ってこれを行う簡単な方法はありますか?

どんな助けでも大変感謝します。

答え1

POSIXAWK:

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

各行に対して、次の操作を行います。

  1. 「データベース」に最初の列があることを確認してください。
  2. それ以外の場合は、「データベース」に追加し、行全体を印刷します。

答え2

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

これにより、最初の列のみでファイルがソートされます。これにより、最初の列がすでに表示されている行は無視されます。

ほとんどの実装には、「安定した」ソートアルゴリズムを使用することを保証するsort非標準-sオプション(上記のコマンドで使用)があります。安定したソートアルゴリズムは、同じキー(あなたの最初の列)を持つアイテムの順序を変更しません。


ただし、より長い成績表(EnsemblとHavanaの両方が100%同意する)に注意してください。エンスダルグ00000032737遺伝子はENSDARP00000049291であり、ENSDARP00000120731ではなくENSDARP00000049290としてコードされる。しかし、それは私の知り合いではありません。

答え3

この慣用的なソリューションは、すべてのUNIXシステムのすべてのシェルですべてのawkと強力に動作します。

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

答え4

すでに最高のソリューションを提供する試みを投稿しました。

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

出力

ENSDARG00000032737    ENSDARP00000120731
ENSDARG00000061051    ENSDARP00000081062

関連情報