何百行ものファイルがあります。
Chr01:19967945-19972643 HanXRQChr01g0004001 1 4698 4698 0.0 8676 100.000 locus_tag=HanXRQChr01g0004001 gn=HanXRQChr01g0004001 begin=19967815 end=19972682 len=4868 chr=HanXRQChr01 strand=-1 sp=Helianthus annuus def=Probable protein kinase superfamily protein
Chr01:23001231-23011701 HanXRQChr01g0004391 1 10470 10470 0.0 19335 100.000 locus_tag=HanXRQChr01g0004391 gn=HanXRQChr01g0004391 begin=22999643 end=23012645 len=13003 chr=HanXRQChr01 strand=1 sp=Helianthus annuus def=Putative squalene cyclase; Squalene cyclase, C-terminal; Squalene cyclase, N-terminal
Chr01:23001231-23011701 HanXRQChr01g0004391 5938 6078 141 7.25e-55 220 95.035 locus_tag=HanXRQChr01g0004391 gn=HanXRQChr01g0004391 begin=22999643 end=23012645 len=13003 chr=HanXRQChr01 strand=1 sp=Helianthus annuus def=Putative squalene cyclase; Squalene cyclase, C-terminal; Squalene cyclase, N-terminal
Chr01:38759426-38779934 HanXRQChr01g0005671 1 20472 20472 0.0 37805 100.000 locus_tag=HanXRQChr01g0005671 gn=SPI begin=38759245 end=38779898 len=20654 chr=HanXRQChr01 strand=1 sp=Helianthus annuus def=Probable beige/BEACH domain ;WD domain, G-beta repeat protein
Chr01:38759426-38779934 HanXRQChr15g0474141 7163 7204 42 1.96e-08 67.6 95.238 locus_tag=HanXRQChr15g0474141 gn=IQD29 begin=37205639 end=37211555 len=5917 chr=HanXRQChr15 strand=-1 sp=Helianthus annuus def=Probable IQ-domain 29
Chr01:38759426-38779934 HanXRQChr15g0474141 7003 7043 41 7.05e-08 65.8 95.122 locus_tag=HanXRQChr15g0474141 gn=IQD29 begin=37205639 end=37211555 len=5917 chr=HanXRQChr15 strand=-1 sp=Helianthus annuus def=Probable IQ-domain 29
一部の行は、最初の行など、最初の列に基づいて一意であり、一部の行のChr01:19967945-1997264
場合は、最初の列に基づいて複数の行がありますChr01:23001231-23011701
。
最初の列の各値に対して最初の行だけを維持したいと思います。最初の行には、列6、列7、および列8の他のパラメータに最適な値が含まれているためです。
私が望む出力は
Chr01:19967945-19972643 HanXRQChr01g0004001 1 4698 4698 0.0 8676 100.000 locus_tag=HanXRQChr01g0004001 gn=HanXRQChr01g0004001 begin=19967815 end=19972682 len=4868 chr=HanXRQChr01 strand=-1 sp=Helianthus annuus def=Probable protein kinase superfamily protein
Chr01:23001231-23011701 HanXRQChr01g0004391 1 10470 10470 0.0 19335 100.000 locus_tag=HanXRQChr01g0004391 gn=HanXRQChr01g0004391 begin=22999643 end=23012645 len=13003 chr=HanXRQChr01 strand=1 sp=Helianthus annuus def=Putative squalene cyclase; Squalene cyclase, C-terminal; Squalene cyclase, N-terminal
Chr01:38759426-38779934 HanXRQChr01g0005671 1 20472 20472 0.0 37805 100.000 locus_tag=HanXRQChr01g0005671 gn=SPI begin=38759245 end=38779898 len=20654 chr=HanXRQChr01 strand=1 sp=Helianthus annuus def=Probable beige/BEACH domain ;WD domain, G-beta repeat protein
答え1
awkを使用して見た最初のフィールドを追跡できます。
awk '!seen[$1]++' infile
seen
これは最初のフィールド()で$1
入力されたハッシュを使用します。増分後に値がseen[$1]
falseであることを確認してください。つまり、新しい値に遭遇した場合はseen[$1]++
0を返し、!seen[$1]++
その値がすでにseen[$1]++
0より大きい値を返した場合は!seen[$1]++
falseになります。
条件がtrueの場合、デフォルトの動作は行全体({ print $0 }
)を印刷することです。これはまさに私たちが望むものなので、スペルを入力する必要はありません。
これは、より詳細で理解しやすい方法で同じことを行います。
awk 'seen[$1] == 0 {
++seen[$1]
print $0
}' infile
答え2
$ sort -u -s -k1,1 file
Chr01:19967945-19972643 HanXRQChr01g0004001 1 4698 4698 0.0 8676 100.000 locus_tag=HanXRQChr01g0004001 gn=HanXRQChr01g0004001 begin=19967815 end=19972682 len=4868 chr=HanXRQChr01 strand=-1 sp=Helianthus annuus def=Probable protein kinase superfamily protein
Chr01:23001231-23011701 HanXRQChr01g0004391 1 10470 10470 0.0 19335 100.000 locus_tag=HanXRQChr01g0004391 gn=HanXRQChr01g0004391 begin=22999643 end=23012645 len=13003 chr=HanXRQChr01 strand=1 sp=Helianthus annuus def=Putative squalene cyclase; Squalene cyclase, C-terminal; Squalene cyclase, N-terminal
Chr01:38759426-38779934 HanXRQChr01g0005671 1 20472 20472 0.0 37805 100.000 locus_tag=HanXRQChr01g0005671 gn=SPI begin=38759245 end=38779898 len=20654 chr=HanXRQChr01 strand=1 sp=Helianthus annuus def=Probable beige/BEACH domain ;WD domain, G-beta repeat protein
このsort
コマンドは、スペースで区切られた最初のフィールドのみをソートキーと見なし、重複キーを削除してソートされたデータを返します(最初に見つかった一意のキーが返されます)。 「安定した」ソートアルゴリズム、つまり同じキーを持つレコードの順序を変更しないソートアルゴリズムを使用するように指示します-s
(これが必要であると100%確信できないが、使用するのが合理的なようです)。sort