根据字符串之间的部分匹配合并两个文件

时间:2015-08-20 08:55:08

标签: regex r

我有两个文件,其中file1中的字符串与file2的最后一列中的字符串部分匹配。我会根据字符串之间的匹配合并这两个文件。当匹配只是部分匹配时,如何解决这个问题,这意味着file1中的字符串通常是file2中的字符串。 PS:案例应该被忽略。

文件1:

AGTAAGGTCAGCTAAATAAGCTATCGGGCCCATACCCCGAAAATGTTGGTTATATCCTTCCCGTACTA    0   1   2   3
CTTCTATGATGAATTTGATTGCATTGATCGTCTGACATGATAATGTATTT  2   11  14  0
AAAGTGGCCTACGCCACCGCCATGGACTGGTTCATAGCCGTGTGCTATGCCTTC  1   2   3   4
AAAGTGTCATATGCCACTGCCATGGATTGGTTCATAGCTGTTTGCTTTGCATTC  50  1   1   21
TACCCTGTAGAACCGAANTTGT  0   0   1   4
TCCCTGTGGTCTAGTGGTTAGGATTCTGCGCTCTCACCGCCGCGGCCCGGG 1   0   4   3
GGGCCAGGATGAAACCTAATTTGAGTGGCCATCCATGGATGAGAAATGCGG 0   1   3   0

file2的:

chrX    Rfam    ncRNA               55609165    55609267    53.97   +   0   ID=RF00019.20;Name=RF00019;Alias=Y_RNA;Note=AL627224.14/36063-36164 chrX:55609165-55609267  ggctggtttgagtgcagtgatgcttacaactaattgatcacatccaattacagatttctttgctctttctgtactcccagtgcttcacttgactagccttta
chrX    Rfam    regulatory_region   57233087    57233370    53.02   -   0   ID=RF01417.3;Name=RF01417;Alias=RSV_RNA;Note=Z83745.1/45303-45021 chrX:57233087-57233370    gtaaatgcaaaccattcacagtcttgctcagctaaggggatagtaaagaaacagtcttttaaatcaatgactattaaaggccaatttcttggaatcatagcaggagaaggcagtcctggctgcaatgtccccataggttgtataactgaattaatggctcttaagtcagttaacattctccatttacctgattttttcttaattacaaaaactggagaatttcaaggggaaaatattggaactatgtgtcctttttctaattgttcagtaactaagtcctcta
chrX    Rfam    regulatory_region   61975961    61976233    45.45   -   0   ID=RF01417.4;Name=RF01417;Alias=RSV_RNA;Note=BX322784.3/89124-88853 chrX:61975961-61976233  AAAGTGTCATATGCCACTGCCATGGATTGGTTCATAGCTGTTTGCTTTGCATTC
chrX    Rfam    ncRNA               62059095    62059167    29.9    +   0   ID=RF00005.18;Name=RF00005;Alias=tRNA;Note=BX119964.4/4840-4911 chrX:62059095-62059167  GTTAATGTAGCTTAATTCATCAAAGCAAGGCACTGAAAAATGCCTAGATGAATACACATGATTCCATTAACA
chrX    Rfam    regulatory_region   62582448    62582735    62.81   -   0   ID=RF01417.5;Name=RF01417;Alias=RSV_RNA;Note=AL158203.12/36753-36467 chrX:62582448-62582735 gtaaacacaaatttttctctgtccttctctgctagatgaatggtataaaaacaatctttaagtcaacaacgattataggccaatcttcaggaattgccacaggggaggggaggacctgttgaagagaccccataggttgcaaattagcattaatagcagttaagtagtgcaaaagtctccatttaccagactttttgggaatgacgaaaatgggcgaattccaaaggctgtttgatggttctatatggccagctttcaattgctcctcaactaattcatgggctctc
chrX    Rfam    ncRNA               63430570    63430868    141.38  +   0   ID=RF00017.15;Name=RF00017;Alias=Metazoa_SRP;Note=AL355852.23/124872-125169 chrX:63430570-63430868  cctggggcagtggcacatgcctgtagtcccagctacttgggaggctgaagcaggaggatagcttaagttcaggagttctgggatgtaatgcactatgctgatagggtgtctgcactaagttcagcatcaacatggtgacctcccaggagcaggggaccaccaggctgcctaaggaggtatgaactggccgagatcagaaacggagcacataaaaacttgcatcttgatcagtagtgggattgcgcctacaaatagccactgcactgcagactgggcaacatagtgagaccttgtctct

1 个答案:

答案 0 :(得分:1)

如果你的文件不是很大,并且awk能够将所有文件2保存在内存中,你可以这样做:

awk  '
ARGIND==1 { save[tolower($NF)] = $0 }
ARGIND==2 { col1 = tolower($1)
     for(pat in save){
      if(pat ~ col1)print $0 " ----- " save[pat]
     }
   }

' file2 file1

首先读取file2并将每一行($ 0)保存在关联数组save中,由最后一个字段($ NF)转换为小写的索引。

然后它读取file1(因此ARGIND是2,第二个文件),并将第1列转换为小写。然后它尝试匹配(〜)这个字符串(或模式真的)与数组中的每个索引。如果匹配,则打印file1中的当前行和file2中保存的行。