
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
次に、それらをawk
1 回のパスで実行します。
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
がわかります。file3
file1
file2
if (NF == 3) {chr=$1; lo=$2; hi=$3}
file3
は、 から来たライン( 内)にいるときに真となるテストですfile1
。 から来たラインを見つけるたびに、と の値と現在の染色体file1
を取得します。lo
hi
else
そうでなければ、私たちはただのライン上にあるのでfile2
.....
if ($1==chr && $2>=lo && $2<=hi) print $1":"lo"-"hi", "$2}
そして、同じ染色体にあり、対象の値が以前から記憶しているとの制限値$2
の間にある場合は、その形式で印刷します。lo
hi
出力は
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 ..