첫 번째 열에 있는 각 항목의 첫 번째 행을 추출하는 방법은 무엇입니까?

첫 번째 열에 있는 각 항목의 첫 번째 행을 추출하는 방법은 무엇입니까?

수백 줄의 파일이 있습니다.

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

관련 정보