比較兩個 tsv 文件

比較兩個 tsv 文件

我正在嘗試比較兩個 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

我已經嘗試過使用awkwhile 循環,但由於某種原因我無法做到這一點。

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......你知道哪些行來自file3file1因為它們只有 3 個字段,file2還有更多......

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

file3當您位於來自 的線路 (in ) 上時,測試為 true file1。每次找到從那時起的一行時file1,您都希望獲得lohi值以及當前染色體

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 ..

相關內容