2つのtsvファイルを比較する

2つのtsvファイルを比較する

2 つの tsv ファイルを比較しようとしています。クエリ対象のファイル (file1) は次のようになります。

Chr      Start      End
chr1    234738546   234738934
chr1    234792654   234793537
chr1    234908151   234908864
chr1    235097868   235098170
chr1    236080566   236081347
chr1    240307621   240308262
chr1    240308207   240308637
chr1    240308546   240308962
chr1    242627058   242627262
chr1    243923195   243923709

別のファイル (file2) の 2 番目の列には、2 列目と 3 列目の数値の間にあるかどうかをチェックし、条件が満たされるまで繰り返したい数値が含まれています。

例:242627060の間にある242627058&242627262

ファイル2は次のようになります:

Chr    Centre_Coord Ignore_this_col   Secondary Information
chr1    234765055   234765056   NR_033927_LINC00184     .   +
chr1    234782033   234782034   NR_125944_LOC101927787  .   +
chr1    234859787   234859788   NR_038856_LINC01132     .   +
chr1    234895802   234895803   NR_148962_PP2672        .   -
chr1    235099745   235099746   NR_125945_LOC101927851  .   -
chr1    235324564   235324565   NR_144491_RBM34         .   -
chr1    235097888   235291252   NR_002956_SNORA14B      .   -
chr1    235097869   235353431   NR_039908_MIR4753       .   -
chr1    235324564   235324565   NR_027762_RBM34         .   -
chr1    235324564   235324565   NM_001346738_RBM34      .   -

次のような出力が得られます。

chr1:242627058-242627262,  242627060

ここで、-区切られた座標はfile1の 2 番目の列からのもので、コンマ区切りはですfile2

すでに while ループの使用を試みましたawkが、何らかの理由でできませんでした。

while read a b c; do col2=$b; col3=$3; tail -n +1 path/to/file2 | awk 'BEGIN{OFS="\t"}{if($2>=$col2 && $2<=$col3) {print $a,$col2,$col3,$2}; break; else continue}' > rohit_TSS.txt; done < file1 

答え1

おそらく、これを 2 つのステップで行う方が簡単でしょう。

すべてをヘルパー ファイルに投入して並べ替えます。

awk 'FNR>1{print $1, $2, $3, $4 }' file1 file2 | sort -k1 >> file3

次に、それらをawk1 回のパスで実行します。

awk '{if (NF == 3) {chr=$1; lo=$2; hi=$3} else { if ($1==chr && $2>=lo && $2<=hi) print $1":"lo"-"hi", "$2}}' file3

......を順に見ていくと、フィールドが 3 つしかないため、どの行がどこから来たのかawkがわかります。file3file1file2

if (NF == 3) {chr=$1; lo=$2; hi=$3}

file3は、 から来たライン( 内)にいるときに真となるテストですfile1。 から来たラインを見つけるたびに、と の値と現在の染色体file1を取得します。lohi

else  

そうでなければ、私たちはただのライン上にあるのでfile2.....

 if ($1==chr && $2>=lo && $2<=hi) print $1":"lo"-"hi", "$2}

そして、同じ染色体にあり、対象の値が以前から記憶しているとの制限値$2の間にある場合は、その形式で印刷します。lohi

出力は

chr1:235097868-235098170, 235097869
chr1:235097868-235098170, 235097888

注記

実際、最初のことを忘れawk

cat file1 file2 | sort > file3

また、行全体をソートするので、chr依存しないはずです。

答え2

for C in `cat file2 |awk -F" " '{ print $2 }' ` ; do 
   echo "Checking $C .." ;
   cat file1 | awk -v var=$C -F" " '{ if ( var  >=$2 && var <=$3 ) print $1":"$2"-"$3", "var  ;  }'; 
done

後で echo "Checking $C .." を削除できます。

Checking 234765055 ..
Checking 234782033 ..
Checking 234859787 ..
Checking 234895802 ..
Checking 235099745 ..
Checking 235324564 ..
Checking 235097888 ..
chr1:235097868-235098170, 235097888
Checking 235097869 ..
chr1:235097868-235098170, 235097869
Checking 235324564 ..
Checking 235324564 ..

関連情報