Tham gia hai tệp với các cột khớp


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 có hai cột & File2.txt có bốn cột. Tôi muốn tham gia cả hai tệp có id duy nhất (mảng [1] phải khớp trong cả hai tệp (file1.txt & file2.txt) và chỉ cung cấp ouput id khớp (xem output.txt).

Tôi đã thử join -v <(sort file1.txt) <(sort file2.txt). Bất kỳ trợ giúp với awk hoặc tham gia các lệnh được yêu cầu.

Câu trả lời:


18

join hoạt động tuyệt vời:

$ 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

ps. không đặt hàng cột ouput?

nếu có sử dụng:

$ 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

làm việc tuyệt vời thứ tự cột không thành vấn đề
jack

Lý do bao gồm những tacgì?
Michael Mrozek

Đó là bởi vì sortđặt chuỗi tiêu đề ở cuối. Thật ra đó là giải pháp bẩn. Và trong trường hợp tiêu đề chung có thể đi vào giữa đầu ra. Tuy nhiên nó hoạt động ở đây.
vội vàng

10

Một cách sử dụng awk:

Nội dung của 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 ] ) 
    }   
}

Chạy nó như:

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

Với kết quả như sau:

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

+65535 để giữ thứ tự dòng ban đầu. :-)
zeekvfu

+65535 để giữ thứ tự dòng ban đầu. :-)
zeekvfu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.