Text-Processing

如何比較文件 1 的第 2 列和第 3 列以及文件 2 的第 4 列和第 5 列

  • September 18, 2019

我有一個製表符分隔的文件 1:

NC_025345       4569   4950   KX838946.2      
NC_025345       16546   17066   KJ641660.1      
NC_025345       11996   12085   KX932454.2

和文件2:

NC_025345.1     RefSeq  gene    5690    7513    .       +       .       ID=gene-NZ82_gp4;Dbxref=GeneID:20964334;Name=NZ82_gp4;gbkey=Gene;gene_biotype=protein_coding;locus_tag=NZ82_gp4
NC_025345.1     RefSeq  gene    8016    10046   .       +       .       ID=gene-NZ82_gp5;Dbxref=GeneID:20964335;Name=NZ82_gp5;gbkey=Gene;gene_biotype=protein_coding;locus_tag=NZ82_gp5
NC_025345.1     RefSeq  gene    10337   16933   .       +       .       ID=gene-NZ82_gp6;Dbxref=GeneID:20964336;Name=NZ82_gp6;gbkey=Gene;gene_biotype=protein_coding;locus_tag=NZ82_gp6

我想將文件 1 的第 2 列和第 3 列與文件 2 的第 4 列和第 5 列進行比較。如果文件 1 的第 2 列和第 3 列重疊或位於文件 2 的第 4 列和第 5 列之間,我想將將文件 1 和文件 2 放入一個新文件中,以提供如下輸出:

NC_025345       11996   12085   KX932454.2     NC_025345.1     RefSeq  gene    10337   16933   .       +       .       ID=gene-NZ82_gp6;Dbxref=GeneID:20964336;Name=NZ82_gp6;gbkey=Gene;gene_biotype=protein_coding;locus_tag=NZ82_gp6

這可能不是最有效的awk腳本:

awk '{
 if (NR==FNR) {
   l[NR]=$0
   a[NR]=$2
   b[NR]=$3
 }
 else if (a[FNR]>=$4 && b[FNR]<=$5) {
   print l[FNR],$0
 }
}' file1 file2 > newfile

讀取第一個文件時 ( NR==FNR),將整行和$0欄位保存在索引(記錄號)處的數組中。讀取第二個文件時,將數組和給定索引(文件的記錄號)中的值與欄位和.$2``$3``NR``a``b``FNR``$4``$5

如果數組值在範圍內,則列印舊行和目前行。輸出被寫入一個新文件newfile

引用自:https://unix.stackexchange.com/questions/541478