使用唯一标识符循环文件并计算累积和

使用唯一标识符循环文件并计算累积和

我有一个很大的文本文件,如下所示,其中column1-colum3定义一个区域,第四列是唯一标识符。第 6 列是区域的指定值。

chr6    26204834    26204839    region1 +   119.862 chr6    26204834    26204835    +   0.982
chr6    26204834    26204839    region1 +   119.862 chr6    26204835    26204836    +   8.487
chr6    26204834    26204839    region1 +   119.862 chr6    26204836    26204837    +   2.664
chr6    26204834    26204839    region1 +   119.862 chr6    26204837    26204838    +   105.065
chr6    26204834    26204839    region1 +   119.862 chr6    26204838    26204839    +   2.664
chr18   72218300    72218307    region2 +   113.879 chr18   72218300    72218301    +   0.982
chr18   72218300    72218307    region2 +   113.879 chr18   72218303    72218304    +   1.357
chr18   72218300    72218307    region2 +   113.879 chr18   72218304    72218305    +   4.887
chr18   72218300    72218307    region2 +   113.879 chr18   72218305    72218306    +   1.706
chr18   72218300    72218307    region2 +   113.879 chr18   72218306    72218307    +   104.947

其中column7-column9是子区域,其中column11是子区域的指定值。

输出:我想为每个标识符中的每个子区域分配累积和。

cat input | grep region1 | awk '{ sum+=$11 } { print $0"\t"sum/$6 }'

这为一个标识符提供了正确的预期输出

chr6    26204834    26204839    region1 +   119.862 chr6    26204834    26204835    +   0.982   0.00819276
chr6    26204834    26204839    region1 +   119.862 chr6    26204835    26204836    +   8.487   0.0789992
chr6    26204834    26204839    region1 +   119.862 chr6    26204836    26204837    +   2.664   0.101225
chr6    26204834    26204839    region1 +   119.862 chr6    26204837    26204838    +   105.065 0.977774
chr6    26204834    26204839    region1 +   119.862 chr6    26204838    26204839    +   2.664   1

对于另一个标识符也是如此

cat input | grep region2 | awk '{ sum+=$11 } { print $0"\t"sum/$6 }' 


chr18   72218300    72218307    region2 +   113.879 chr18   72218300    72218301    +   0.982   0.00862319
chr18   72218300    72218307    region2 +   113.879 chr18   72218303    72218304    +   1.357   0.0205393
chr18   72218300    72218307    region2 +   113.879 chr18   72218304    72218305    +   4.887   0.0634533
chr18   72218300    72218307    region2 +   113.879 chr18   72218305    72218306    +   1.706   0.0784341
chr18   72218300    72218307    region2 +   113.879 chr18   72218306    72218307    +   104.947 1

我如何通过定义数组中的所有标识符并运行文本文件来自动化此操作。

答案1

这是一种方法:

$ awk -vOFS='\t' '{ a[$4]+=$11/$6; print $0,a[$4]}' file 
chr6    26204834    26204839    region1 +   119.862 chr6    26204834    26204835    +   0.982   0.00819276
chr6    26204834    26204839    region1 +   119.862 chr6    26204835    26204836    +   8.487   0.0789992
chr6    26204834    26204839    region1 +   119.862 chr6    26204836    26204837    +   2.664   0.101225
chr6    26204834    26204839    region1 +   119.862 chr6    26204837    26204838    +   105.065 0.977774
chr6    26204834    26204839    region1 +   119.862 chr6    26204838    26204839    +   2.664   1
chr18   72218300    72218307    region2 +   113.879 chr18   72218300    72218301    +   0.982   0.00862319
chr18   72218300    72218307    region2 +   113.879 chr18   72218303    72218304    +   1.357   0.0205393
chr18   72218300    72218307    region2 +   113.879 chr18   72218304    72218305    +   4.887   0.0634533
chr18   72218300    72218307    region2 +   113.879 chr18   72218305    72218306    +   1.706   0.0784341
chr18   72218300    72218307    region2 +   113.879 chr18   72218306    72218307    +   104.947 1

技巧是使用区域标识符作为关联数组的键(a在本例中为 )。然后,您可以在读取文件时增加与该键关联的值。

相关内容