Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当第二个文件列包含逗号时,使用awk将一个文件的列与另一个文件的列匹配_Awk_Grep_Delimiter - Fatal编程技术网

当第二个文件列包含逗号时,使用awk将一个文件的列与另一个文件的列匹配

当第二个文件列包含逗号时,使用awk将一个文件的列与另一个文件的列匹配,awk,grep,delimiter,Awk,Grep,Delimiter,我有两个文件——一个是包含基因变体的大文件,多个列用tab分隔。包含基因名称的列可以包含单个名称,也可以包含多个名称(示例中的基因名称为SAMD11和NOC2L): 第二个文件是基因名称的单列列表,如下所示: EVC2 SAMD11 COMT 我想将第二个文件中的基因名称与第一个文件中的基因名称进行匹配。我目前正在使用awk: awk -F $'\t' 'BEGIN { while(getline <"secondfile.txt") gene[$0]=1; } gene[$7]' fi

我有两个文件——一个是包含基因变体的大文件,多个列用tab分隔。包含基因名称的列可以包含单个名称,也可以包含多个名称(示例中的基因名称为SAMD11和NOC2L):

第二个文件是基因名称的单列列表,如下所示:

EVC2
SAMD11
COMT
我想将第二个文件中的基因名称与第一个文件中的基因名称进行匹配。我目前正在使用awk:

awk -F $'\t' 'BEGIN { while(getline <"secondfile.txt") gene[$0]=1; } gene[$7]' firstfile.txt > newfile.txt
我希望它仍然能够精确匹配,因为一些基因的名称可能是相似的——例如,可能有一个基因叫做SAMD1,如果我对它进行模糊匹配,那么我会得到SAMD1,SAMD11等等。所以我需要一个精确匹配的东西,但是忽略gene name列中的逗号,或者将其视为字段分隔符或类似的东西

提前谢谢

$ 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
这也将有助于:

$ cat tst.awk
NR==FNR { genes[$0]; next }
{
    for (gene in genes) {
        if ($7 ~ "(^|,)"gene"(,|$)") {
            print
            next
        }
    }
}

谢谢,我已经这样做了。谢谢你,这很有效!我可以问一下拆分中的“a”在做什么吗?这是
split()
正在填充的数组的名称。手动拖动并查找
split()
。我也将为您发布一些备选方案-可能是awk的一个很好的介绍,让您了解一些解决问题的不同方法。注意-它们都不涉及
getline
$ 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
$ cat tst.awk
NR==FNR { genes[$0]; next }
{
    for (gene in genes) {
        if ($7 ~ "(^|,)"gene"(,|$)") {
            print
            next
        }
    }
}