Gabung dua file dengan kolom yang cocok


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 memiliki dua kolom & File2.txt memiliki empat kolom. Saya ingin bergabung dengan kedua file yang memiliki id unik (array [1] harus cocok dengan kedua file (file1.txt & file2.txt) dan memberikan id hanya cocok ouput (lihat output.txt).

Saya sudah mencoba join -v <(sort file1.txt) <(sort file2.txt). Setiap bantuan dengan awk atau bergabung dengan perintah yang diminta.

Jawaban:


18

join bekerja dengan baik:

$ 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. Apakah urutan kolom ouput penting?

jika ya gunakan:

$ 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

bekerja dengan baik. pesanan kolom tidak masalah
jack

Apa alasannya termasuk tac?
Michael Mrozek

Itu karena sortmenempatkan string header di akhir. Sebenarnya ini solusi kotor. Dan secara umum header mungkin masuk ke tengah output. Namun itu bekerja di sini.
buru

10

Salah satu cara menggunakan awk:

Isi dari 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 ] ) 
    }   
}

Jalankan seperti:

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

Dengan hasil sebagai berikut:

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

+65535 untuk menjaga urutan garis asli. :-)
zeekvfu

+65535 untuk menjaga urutan garis asli. :-)
zeekvfu
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.