2012-05-24 2 views
2

I는 다음과 같다 탭 구분 파일 가지고UNIQ 요소 추출

ABCA2 chr9 139021506 139043195 
ABCA2 chr9 139021506 139042561 
ABCC1 chr16 15950934 16144431 
ABCC1 chr16 15950934 16144431 
ABCC1 chr16 15950934 16144431 
ABCC1 chr16 15950934 16144431 
I 열 2,3 ABCA2의 값과 같이, 열을 기반 값을 추출 할

, 4 추출되어야한다 한 번만 열 이름이 column1에 처음 생깁니다.

바람직한 출력은 다음과 같습니다

ABCA2 chr9 139021506 139043195 
ABCC1 chr16 15950934 16144431 

감사합니다

+0

파이썬이나 배쉬 중 어느 것을 시도 했습니까? – Mark

+0

@khalid : 나는 컷 -f1 | uniq ...하지만이 상황에서는 작동하지 않습니다. – Angelo

+0

질문은 원하는 출력이 찾고있는 것이 아니기 때문에 조금 혼란 스럽습니다. col1의 값과 데이터의 후속 열을 처음 찾지 않는 한 파일의 처음 3 줄을 출력해야합니다 들어 있습니까? –

답변

7

문제에 대한 설명이 모호하지만, 나는 그것이 당신은 단지 라인 출력하려는 ​​의미로 해석하고 경우 항목 그것의 첫번째 란은 아직 보이지 않았다. 간단하게 예를 들어 입력을 사용

awk '! a[$1]++' input-file 
5

file.txt에, uniq --check-chars=5 file.txt이 출력을 제공 더

awk '{if(!seen[$1]++) print }' input-file 

또는 : 이것은 python 태그 이유 AWK는 분명히 올바른 도구이기 때문에 나는 모르는

ABCA2 chr9 139021506 139043195 
ABCC1 chr16 15950934 16144431 

각 줄의 처음 5 문자 만 비교하는 것으로 제한되어 있습니다.

편집는 : 윌리엄 Pursell는 지적

, uniq 파일이 이미 정렬되어 있다고 가정합니다. 대안은 sort을 사용하는 것입니다

$ sort --key=1,1 --unique file.txt 
ABCA2 chr9 139021506 139043195 
ABCC1 chr16 15950934 16144431 
$ 

아래 윌리엄 Pursells 주석을주의해야합니다 : 입력 데이터의 정렬은 명시된 바와 같이 문제를 해결하기 위해 반드시 필요한 것은 아니다. 속도가 중요하다면/데이터 볼륨이 크면 보이는 키를 암기하는 선형 솔루션 (예 : Williams 대답의 awk 소리)이 좋습니다.

+0

입력이 이미 첫 번째 열에서 정렬되었다고 가정합니다. –

+0

@WilliamPursell : 감사합니다. 그것을 밖으로 poiting 위해. 방금 'sort'를 사용하여 예제를 사용하여 답변을 업데이트했습니다. –

+1

이것은 심미적으로 매력적인 솔루션이지만, awk 솔루션보다 많은 표를 얻고 있기 때문에 불필요한 작업임을 지적하는 것이 좋습니다. 특히,/usr/share/dict/words에있는 두 가지 솔루션을 실행하는 시스템에서 awk는 3 배 이상 빠르게 실행됩니다. –

1
>>> d = {} 
>>> with open('f.txt') as f: 
... for line in f.readlines(): 
...  x = line.split() 
...  if x[0] not in d.keys(): 
...   d[x[0]] = x[1:] 
... 
>>> for k,v in d.iteritems(): 
... print k,' '.join(v) 
... 
ABCA2 chr9 139021506 139043195 
ABCC1 chr16 15950934 16144431