我正在尝试比较两个 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列和第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
,逗号与 的第二列分隔file2
。
我已经尝试过使用awk
while 循环,但由于某种原因我无法做到这一点。
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
可能更容易通过两步完成此操作。
将所有内容放入辅助文件并排序。
awk 'FNR>1{print $1, $2, $3, $4 }' file1 file2 | sort -k1 >> file3
awk
然后只需一次遍历它们即可。
awk '{if (NF == 3) {chr=$1; lo=$2; hi=$3} else { if ($1==chr && $2>=lo && $2<=hi) print $1":"lo"-"hi", "$2}}' file3
走过awk
......你知道哪些行来自file3
,file1
因为它们只有 3 个字段,file2
还有更多......
if (NF == 3) {chr=$1; lo=$2; hi=$3}
file3
当您位于来自 的线路 (in ) 上时,该测试为 true 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 ..