작업 중인 파일의 작은 조각이 있습니다.
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
}
각 줄에 대해 다음을 수행합니다.
- "데이터베이스"에 첫 번째 열이 있는지 확인하십시오.
- 그렇지 않은 경우 "데이터베이스"에 추가하고 전체 줄을 인쇄합니다.
답변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