2013-10-30 2 views
-1

그래서이 질문은 저를 괴롭 히고 있습니다. 그래서 나는이 프로젝트를 끝내기를 희망하고 있습니다. 지금까지 나는 대답을 찾을 수 없었습니다. 꽤 간단 해 보입니다. 나는 다음을 사용했다 :

awk '$1' merged_counts.txt |sort|uniq -d|wc 

그리고 216 라인을 얻었다. 그러나이 번호는 올바르지 않습니다. 내가 사용하는 경우

more merged_counts.txt|cut -f 1|sort|uniq -d|wc 

나는 271 줄을 얻는다. 내가 사용하는 경우

awk '{print $1}' merged_counts.txt |sort|uniq -d|wc 

또한 271 행을 얻지 만 나머지 필드도 잃어 버렸습니다. 나는 이것이 초등적인 것으로 보이는 것에 대해 왜 이런 식으로 행동 하는지를 알 수 없다. 어떤 도움이나 제안을 주셔서 감사합니다. 확실하게 나는 무엇인가를 멀리 바라 볼 것임에 틀림 없다. 파일의

예 :

B3GALT1 72 128 65 124 87 118 102 117 38 106 87 115 27 20 89 30 
AMY1A 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 
PSENEN 654 459 648 462 508 399 537 532 696 460 625 473 621 322 633 434 

유전자 'AMY1A은'내 파일에 두 번 나타나도록 두 DNA 가닥에 주석하는 유전자 중 하나입니다. awk합니다 (-F 옵션을 통해 변경 기본적으로) 공백의 실행을 사용하는 반면

+0

Btw, 제 질문은 216 대 271을 얻는 이유입니다. awk 인쇄를 사용하면 나머지 필드가 제거된다는 것을 알고 있습니다. 감사! – user2937872

+0

'cat'이나 더 나은'cut -f 1 chepner

+0

나쁜 습관. 실제로 뭔가를 연결하려는 경우 내 머리 속의 어떤 것만이 고양이를 사용할 수 있습니다. – user2937872

답변

2

나는 코멘트에서 I need to keep the entire line, but I need to filter for duplicates based only on the first field라고 말하며, 필드가 공백으로 구분되어 있고 중복이 발생할 때 항상 첫 번째 줄을 인쇄한다고 가정 해 보겠습니다. 이제

awk '!seen[$1]++' file 

- 당신이 필요로하는 그 밖의 무엇을 우리에게 설명, 입력 및 출력 질문을 업데이트 : 당신이 다음 사용하십시오

awk 명령이 될 것입니다.

+0

너무 많은 것을 제공하지 않고 조금 더 자세하게 질문을 편집했습니다. – user2937872

1

cut은 별도의 필드합니다 (-d 옵션을 통해 기본적으로 tab하지만 변경) 단일 문자를 사용합니다.

awk '$1'$1이 첫 번째 필드뿐만 아니라 false로 간주되지 않을 때 전체 라인을 인쇄합니다. 이렇게하면 중복되는 행이 줄어들며 (두 행은 동일한 첫 번째 필드를 가질 수 있지만 후속 필드는 다를 수 있음) 행 수가 줄어 듭니다.

+0

안녕하세요 @chepner. 저는 cut과 awk에서 구분 기호를 변경할 수 있다는 것을 알고 있습니다. 문제는 전체 라인을 유지할 필요가 있지만 첫 번째 필드에만 기반한 중복을 필터링해야한다는 것입니다. 271 개의 복제본이 있다는 것을 알고 있습니다. 최종 목표는 중복 된 유전자 이름이 허용되지 않는 다른 분석 목적을 위해 복제물에 짧은 문자열을 추가하는 것입니다. 나는 awk '$ 1'에 대해 당신이 말하는 것을 이해하고 있다고 생각합니다. 그렇다면 어떻게하면 전체 라인을 유지할 수 있지만 첫 번째 필드에서만 필터 할 수 있습니까? – user2937872

+0

awk에는 표준 트릭이 있습니다 : awk uniq [uniq [$ 1] ++; ...} '''$ 1'이 전에 관찰되지 않았을 때만 행을 처리합니다. 첫 번째로 할 일은 그 필드를 저장하는 것이므로, 같은'$ 1 '을 가진 미래의 라인을 무시할 것이다. – chepner

2

awk '$1', 빈 중 하나 또는 공백 만 포함하거나 첫 번째 필드는 0의 숫자 값으로 평가되는 곳 cut -f 1이 작업을 수행하지 않습니다 라인을 제외한 모든 인쇄 것입니다 (awk '{print $1}'와 혼동하지 말 것)과 의지 공백과 공백 만있는 줄을 포함하십시오.

+0

빈 경우 및 공백 전용 줄이이 경우 문제가되지 않습니다. 이 25k + 라인 파일의 복제본은 정방향 및 역방향 모두에 주석이 달린 유전자에서 발생하므로 최종 파일에 두 번 나타납니다. 일부는 쉽게 잡을 수 있었고 다른 일부는 내 대본을 계속 피할 수있었습니다. :/ – user2937872

+0

... 또는 $ 1 값이 0 인 행. –

+1

@EdMorton 잘 잡았습니다 ... 업데이트되었습니다. – twalberg