私が使用しているファイルの小さな部分があります。
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
}
各行に対して、次の操作を行います。
- 「データベース」に最初の列があることを確認してください。
- それ以外の場合は、「データベース」に追加し、行全体を印刷します。
答え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