2열 파일에서 처음 나타나는 고유 값을 인쇄하는 방법은 무엇입니까?

2열 파일에서 처음 나타나는 고유 값을 인쇄하는 방법은 무엇입니까?

내가 사용하고 있는 파일의 작은 조각이 있습니다.

ENSDARG00000032737    ENSDARP00000120731
ENSDARG00000032737    ENSDARP00000049290
ENSDARG00000061051    ENSDARP00000081062
ENSDARG00000061051     
ENSDARG00000061051    ENSDARP00000129708

첫 번째 열에 각 고유 값의 첫 번째 인스턴스를 인쇄하고 두 번째 열에 해당 값을 인쇄하고 싶으므로 원하는 출력은 다음과 같습니다.

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

관련 정보