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.

mendongkrak
sumber

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
buru-buru
sumber
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
Birei
sumber
+65535 untuk menjaga urutan garis asli. :-)
zeekvfu
+65535 untuk menjaga urutan garis asli. :-)
zeekvfu