Cocokkan kolom satu file dengan kolom lain menggunakan awk ketika kolom file kedua berisi koma

Saya memiliki dua file - satu adalah file besar yang berisi varian gen, dengan beberapa kolom dipisahkan berdasarkan tab. Kolom yang berisi nama gen dapat berisi satu nama, atau beberapa nama yang dipisahkan dengan koma (contoh nama gen adalah SAMD11 dan NOC2L):

1   874816  874816  -   T   rs200996316 SAMD11  exonic  ENSG00000187634 frameshift insertion
1   878331  878331  C   T   rs148327885 SAMD11  exonic  ENSG00000187634 nonsynonymous SNV
1   879676  879676  G   A   rs6605067   NOC2L,SAMD11    UTR3    ENSG00000187634,ENSG00000188976
1   879687  879687  T   C   rs2839  NOC2L,SAMD11    UTR3    ENSG00000187634,ENSG00000188976
1   881918  881918  G   A   rs35471880  NOC2L   exonic  ENSG00000188976 nonsynonymous SNV
1   888659  888659  T   C   rs3748597   NOC2L   exonic  ENSG00000188976 nonsynonymous SNV

File kedua adalah satu kolom daftar nama gen, seperti ini:

EVC2
SAMD11
COMT

Saya ingin mencocokkan nama gen di file kedua dengan nama gen di file pertama. Saat ini saya menggunakan awk:

awk -F $'\t' 'BEGIN { while(getline <"secondfile.txt") gene[$0]=1; } gene[$7]' firstfile.txt > newfile.txt

Namun, ini hanya mencetak pencocokan persis sehingga tidak mencetak garis dengan NOC2L,SAMD11. Dari contoh di atas, keluaran yang diharapkan adalah empat baris pertama dari file pertama:

1   874816  874816  -   T   rs200996316 SAMD11  exonic  ENSG00000187634 frameshift insertion
1   878331  878331  C   T   rs148327885 SAMD11  exonic  ENSG00000187634 nonsynonymous SNV
1   879676  879676  G   A   rs6605067   NOC2L,SAMD11    UTR3    ENSG00000187634,ENSG00000188976
1   879687  879687  T   C   rs2839  NOC2L,SAMD11    UTR3    ENSG00000187634,ENSG00000188976

Saya ingin agar gen tersebut tetap melakukan pencocokan persis, karena beberapa nama gen mungkin serupa - misalnya mungkin ada gen bernama SAMD1, dan jika saya melakukan pencocokan fuzzy untuk itu maka saya akan mendapatkan SAMD1, SAMD11, dan seterusnya. Jadi saya memerlukan sesuatu yang sama persis tetapi mengabaikan koma di kolom nama gen, atau memperlakukannya sebagai pembatas bidang atau serupa.

Terima kasih sebelumnya.


person azule_r    schedule 25.09.2015    source sumber
comment
Terima kasih, sudah melakukannya.   -  person azule_r    schedule 26.09.2015


Jawaban (1)


$ cat tst.awk
NR==FNR { genes[$0]; next }
{
    split($7,a,/,/)
    for (i in a) {
        if (a[i] in genes) {
            print
            next
        }
    }
}

$ awk -f tst.awk secondfile.txt firstfile.txt
1   874816  874816  -   T   rs200996316 SAMD11  exonic  ENSG00000187634 frameshift insertion
1   878331  878331  C   T   rs148327885 SAMD11  exonic  ENSG00000187634 nonsynonymous SNV
1   879676  879676  G   A   rs6605067   NOC2L,SAMD11    UTR3    ENSG00000187634,ENSG00000188976
1   879687  879687  T   C   rs2839  NOC2L,SAMD11    UTR3    ENSG00000187634,ENSG00000188976

Ini juga akan berhasil:

$ cat tst.awk
NR==FNR { genes[$0]; next }
{
    for (gene in genes) {
        if ($7 ~ "(^|,)"gene"(,|$)") {
            print
            next
        }
    }
}
person Ed Morton    schedule 25.09.2015
comment
Terima kasih, itu berhasil! Bisakah saya bertanya apa yang dilakukan 'a' di split? - person azule_r; 26.09.2015
comment
Itulah nama array yang diisi split(). kawan awk dan lihat ke atas split(). Saya juga akan memposting beberapa alternatif untuk Anda - mungkin ini merupakan pengantar yang bagus untuk awk agar Anda dapat melihat beberapa cara berbeda untuk mengatasi masalah tersebut. Catatan - tidak satupun yang melibatkan getline! - person Ed Morton; 26.09.2015