【问题标题】:merge two files based on partial match between strings根据字符串之间的部分匹配合并两个文件
【发布时间】:2015-08-20 08:55:08
【问题描述】:

我有两个文件,其中 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

文件2:

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

【问题讨论】:

    标签: regex r


    【解决方案1】:

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

    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 中保存的行。

    【讨论】:

    • 您的示例数据均不匹配。提供一些其他数据。
    • 是否需要全匹配?
    • 没有。就像你说的,“file1 中的字符串 ... 是 file2 中的字符串的子字符串”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-28
    • 2021-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多