내가 사용하고 있는 파일의 작은 조각이 있습니다.
ENSDARG00000032737 ENSDARP00000120731
ENSDARG00000032737 ENSDARP00000049290
ENSDARG00000061051 ENSDARP00000081062
ENSDARG00000061051
ENSDARG00000061051 ENSDARP00000129708
첫 번째 열에 각 고유 값의 첫 번째 인스턴스를 인쇄하고 두 번째 열에 해당 값을 인쇄하고 싶으므로 원하는 출력은 다음과 같습니다.
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