ファイル1の列2と3とファイル2の列4と5を比較する方法

ファイル1の列2と3とファイル2の列4と5を比較する方法

タブ区切りのファイル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

ベストアンサー1

これは最も効率的な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(レコード番号)に保存します$3NR2番目のファイルを読み取ると、配列の値とa指定bされたインデックスFNR(ファイルのレコード番号)の値がフィールドsumと$4比較されます$5

配列値が範囲内にある場合は、前の行と現在の行を印刷します。出力は新しいファイルに書き込まれますnewfile

おすすめ記事