일치하는 열이있는 두 파일 결합


11

File1.txt

    id                            No
    gi|371443199|gb|JH556661.1| 7907290
    gi|371443198|gb|JH556662.1| 7573913
    gi|371443197|gb|JH556663.1| 7384412
    gi|371440577|gb|JH559283.1| 6931777

File2.txt

 id                              P       R       S
 gi|367088741|gb|AGAJ01056324.1| 5       5       0
 gi|371443198|gb|JH556662.1|     2       2       0
 gi|367090281|gb|AGAJ01054784.1| 4       4       0
 gi|371440577|gb|JH559283.1|     21      19      2

output.txt

 id                              P       R       S  NO
 gi|371443198|gb|JH556662.1|     2       2       0  7573913
 gi|371440577|gb|JH559283.1|     21      19      2  6931777

File1.txt에는 두 개의 열이 있고 File2.txt에는 네 개의 열이 있습니다. 고유 ID (array [1]이 두 파일 (file1.txt & file2.txt)와 일치해야하며 출력에만 일치하는 ID를 제공해야합니다 (output.txt 참조).

나는 노력했다 join -v <(sort file1.txt) <(sort file2.txt). awk 또는 join 명령에 대한 도움이 요청되었습니다.

답변:


18

join 잘 작동합니다 :

$ join <(sort File1.txt) <(sort File2.txt) | column -t | tac
 id                           No       P   R   S
 gi|371443198|gb|JH556662.1|  7573913  2   2   0
 gi|371440577|gb|JH559283.1|  6931777  21  19  2

추신. 출력 열 순서가 중요합니까?

그렇다면 다음을 사용하십시오.

$ join <(sort 1) <(sort 2) | tac | awk '{print $1,$3,$4,$5,$2}' | column -t
 id                           P   R   S  No
 gi|371443198|gb|JH556662.1|  2   2   0  7573913
 gi|371440577|gb|JH559283.1|  21  19  2  6931777

잘 작동합니다. 열 순서는 중요하지 않습니다
jack

포함 이유는 무엇입니까 tac?
Michael Mrozek

sort헤더 문자열을 끝에 배치 하기 때문 입니다. 실제로 그것은 더러운 해결책입니다. 그리고 일반적으로 헤더는 출력 중간에 들어갈 수 있습니다. 그러나 여기에서 작동합니다.
rush

10

한 가지 방법으로 awk:

내용 script.awk:

## Process first file of arguments. Save 'id' as key and 'No' as value
## of a hash.
FNR == NR {
    if ( FNR == 1 ) { 
        header = $2
        next
    }   
    hash[ $1 ] = $2
    next
}

## Process second file of arguments. Print header in first line and for
## the rest check if first field is found in the hash.
FNR < NR {
    if ( $1 in hash || FNR == 1 ) { 
        printf "%s %s\n", $0, ( FNR == 1 ? header : hash[ $1 ] ) 
    }   
}

다음과 같이 실행하십시오.

awk -f script.awk File1.txt File2.txt | column -t

결과는 다음과 같습니다.

id                           P   R   S  NO
gi|371443198|gb|JH556662.1|  2   2   0  7573913
gi|371440577|gb|JH559283.1|  21  19  2  6931777

원래 라인 순서를 유지하기위한 +65535 :-)
zeekvfu

원래 라인 순서를 유지하기위한 +65535 :-)
zeekvfu
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.