2열 파일에서 고유 값이 처음 나타나는 줄을 어떻게 인쇄합니까?

2열 파일에서 고유 값이 처음 나타나는 줄을 어떻게 인쇄합니까?

작업 중인 파일의 작은 조각이 있습니다.

ENSDARG00000032737    ENSDARP00000120731
ENSDARG00000032737    ENSDARP00000049290
ENSDARG00000061051    ENSDARP00000081062
ENSDARG00000061051     
ENSDARG00000061051    ENSDARP00000129708

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

ENSDARG00000032737    ENSDARP00000120731
ENSDARG00000061051    ENSDARP00000081062

awk나 uniq 또는 이와 유사한 것을 사용하여 이를 수행하는 간단한 방법이 있습니까?

어떤 도움이라도 주시면 감사하겠습니다.

답변1

POSIX AWK:

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

관련 정보