我认为我的问题并不清楚。所以,还有时间用另一种方法来解释我的任务。
以下是我之前给出的解释,显然不是很好
使用AWK我试图在一个整数列表上“滑动一个窗口”。如果我将这个数据集分开,每个(可能重叠的)bin中会有多少数据点?我喜欢设置binsize(或windowsize)并在bin之间重叠。这种方法使我能够了解本地数据点密度。 - >我有一点AWK的经验,我被告知AWK应该能够完成这项工作,我更喜欢使用AWK。但是,我也对其他想法持开放态度(例如Python)。
我准备了一些附在下面的示例文件。但是,为了更容易理解这里是另一个非常简单的例子:
Datarange 1 - 10
Integers in dataset: 2,4,5,6,9
####
####Example 1: Windowsize=5,overlap=2####
####
file name ="1" contents are: (range is 1 - 5)
2
4
5
file name="3" contents are: (range is 4 - 8, that is, two overlap with previous range)
4
5
6
file name="7" contents are: (range is 7 - 10, if the range was larger, it would be 7 - 11)
9
####
####Example 2: Windowsize=3,overlap=0####
####
file name="1" contents are (range 1 - 3)
2
file name="4" contents are (range 4 - 6)
4
5
6
file name="7" contents are (range 7 - 9)
9
file name="9" contents are (range 10 - 10)
<none>
示例输入文件
3579
3661
3752 EXON 3706 4407 + Solyc06g005000.2.1.1Solyc06g005000.2.1
3947 EXON 3706 4407 + Solyc06g005000.2.1.1Solyc06g005000.2.1
6734 INTRON 5605 7662 + Solyc06g005000.2.1.2Solyc06g005000.2.1
6865 INTRON 5605 7662 + Solyc06g005000.2.1.2Solyc06g005000.2.1
6915 INTRON 5605 7662 + Solyc06g005000.2.1.2Solyc06g005000.2.1
8961
13471 EXON 13449 13532 + Solyc06g005020.1.1.2Solyc06g005020.1.1
13561 INTRON 13533 13710 + Solyc06g005020.1.1.2Solyc06g005020.1.1
22226 EXON 22106 22261 + Solyc06g005030.1.1.1Solyc06g005030.1.1
22516
22556
36903 INTRON 36836 36915 + Solyc06g005060.2.1.1Solyc06g005060.2.1
37377 EXON 36916 37800 + Solyc06g005060.2.1.2Solyc06g005060.2.1
37605 EXON 36916 37800 + Solyc06g005060.2.1.2Solyc06g005060.2.1
37935 3P_UTR 37801 38132 + Solyc06g005060.2.1.0Solyc06g005060.2.1
167942 5P_UTR 167930 167956 - Solyc06g005140.2.1.0Solyc06g005140.2.1
168020 INTRON 167957 169025 - Solyc06g005140.2.1.2Solyc06g005140.2.1
168153 INTRON 167957 169025 - Solyc06g005140.2.1.2Solyc06g005140.2.1
具有不同窗口大小和重叠的示例输出文件
> AWK -v windowsize=50000 -v overlap=0 -f awkscript input.file
> ls
1 50001
100001 150001
> cat 1
3579
3661
3752 EXON 3706 4407 + Solyc06g005000.2.1.1Solyc06g005000.2.1
3947 EXON 3706 4407 + Solyc06g005000.2.1.1Solyc06g005000.2.1
6734 INTRON 5605 7662 + Solyc06g005000.2.1.2Solyc06g005000.2.1
6865 INTRON 5605 7662 + Solyc06g005000.2.1.2Solyc06g005000.2.1
6915 INTRON 5605 7662 + Solyc06g005000.2.1.2Solyc06g005000.2.1
8961
13471 EXON 13449 13532 + Solyc06g005020.1.1.2Solyc06g005020.1.1
13561 INTRON 13533 13710 + Solyc06g005020.1.1.2Solyc06g005020.1.1
22226 EXON 22106 22261 + Solyc06g005030.1.1.1Solyc06g005030.1.1
22516
22556
36903 INTRON 36836 36915 + Solyc06g005060.2.1.1Solyc06g005060.2.1
37377 EXON 36916 37800 + Solyc06g005060.2.1.2Solyc06g005060.2.1
37605 EXON 36916 37800 + Solyc06g005060.2.1.2Solyc06g005060.2.1
37935 3P_UTR 37801 38132 + Solyc06g005060.2.1.0Solyc06g005060.2.1
3752 EXON 3706 4407 + Solyc06g005000.2.1.1Solyc06g005000.2.1
3947 EXON 3706 4407 + Solyc06g005000.2.1.1Solyc06g005000.2.1
6734 INTRON 5605 7662 + Solyc06g005000.2.1.2Solyc06g005000.2.1
6865 INTRON 5605 7662 + Solyc06g005000.2.1.2Solyc06g005000.2.1
6915 INTRON 5605 7662 + Solyc06g005000.2.1.2Solyc06g005000.2.1
8961
13471 EXON 13449 13532 + Solyc06g005020.1.1.2Solyc06g005020.1.1
13561 INTRON 13533 13710 + Solyc06g005020.1.1.2Solyc06g005020.1.1
22226 EXON 22106 22261 + Solyc06g005030.1.1.1Solyc06g005030.1.1
22516
22556
36903 INTRON 36836 36915 + Solyc06g005060.2.1.1Solyc06g005060.2.1
37377 EXON 36916 37800 + Solyc06g005060.2.1.2Solyc06g005060.2.1
37605 EXON 36916 37800 + Solyc06g005060.2.1.2Solyc06g005060.2.1
37935 3P_UTR 37801 38132 + Solyc06g005060.2.1.0Solyc06g005060.2.1
> cat 50001
> cat 100001
> cat 150001
167942 5P_UTR 167930 167956 - Solyc06g005140.2.1.0Solyc06g005140.2.1
168020 INTRON 167957 169025 - Solyc06g005140.2.1.2Solyc06g005140.2.1
168153 INTRON 167957 169025 - Solyc06g005140.2.1.2Solyc06g005140.2.1
> #And with some different paramenters
> AWK -v windowsize=160000 -v overlap=10000 -f awkscript input.file
> ls
1 10001
> cat 1
3579
3661
3752 EXON 3706 4407 + Solyc06g005000.2.1.1Solyc06g005000.2.1
3947 EXON 3706 4407 + Solyc06g005000.2.1.1Solyc06g005000.2.1
6734 INTRON 5605 7662 + Solyc06g005000.2.1.2Solyc06g005000.2.1
6865 INTRON 5605 7662 + Solyc06g005000.2.1.2Solyc06g005000.2.1
6915 INTRON 5605 7662 + Solyc06g005000.2.1.2Solyc06g005000.2.1
8961
13471 EXON 13449 13532 + Solyc06g005020.1.1.2Solyc06g005020.1.1
13561 INTRON 13533 13710 + Solyc06g005020.1.1.2Solyc06g005020.1.1
22226 EXON 22106 22261 + Solyc06g005030.1.1.1Solyc06g005030.1.1
22516
22556
36903 INTRON 36836 36915 + Solyc06g005060.2.1.1Solyc06g005060.2.1
37377 EXON 36916 37800 + Solyc06g005060.2.1.2Solyc06g005060.2.1
37605 EXON 36916 37800 + Solyc06g005060.2.1.2Solyc06g005060.2.1
37935 3P_UTR 37801 38132 + Solyc06g005060.2.1.0Solyc06g005060.2.1
> cat 10001
13471 EXON 13449 13532 + Solyc06g005020.1.1.2Solyc06g005020.1.1
13561 INTRON 13533 13710 + Solyc06g005020.1.1.2Solyc06g005020.1.1
22226 EXON 22106 22261 + Solyc06g005030.1.1.1Solyc06g005030.1.1
22516
22556
36903 INTRON 36836 36915 + Solyc06g005060.2.1.1Solyc06g005060.2.1
37377 EXON 36916 37800 + Solyc06g005060.2.1.2Solyc06g005060.2.1
37605 EXON 36916 37800 + Solyc06g005060.2.1.2Solyc06g005060.2.1
37935 3P_UTR 37801 38132 + Solyc06g005060.2.1.0Solyc06g005060.2.1
167942 5P_UTR 167930 167956 - Solyc06g005140.2.1.0Solyc06g005140.2.1
168020 INTRON 167957 169025 - Solyc06g005140.2.1.2Solyc06g005140.2.1
168153 INTRON 167957 169025 - Solyc06g005140.2.1.2Solyc06g005140.2.1
非常感谢你的帮助!
我最初的问题很少调整,因为我需要的计算时间比预期的要多。
是否有可能将每个窗口的“统计信息”写入表中的一行,而不是将属于特定窗口的所有记录写入其自己的文件中?使用统计数据我的意思是,特定窗口包含多少条记录以及每种类型有多少条记录。应用于上面的示例,这将是这样的:
> python script.py 160000 10000 file (using the script from sidharth c nadhan)
> cat result
window | total | exons | intron | 3P_UTR | 5P_UTR
1 | 17 | 6 | 5 | 1 | 0
10001 | 12 | 4 | 4 | 1 | 1
答案 0 :(得分:1)
试试这个:
import sys,os,collections
list1,set1=list(),set()
dict1 = collections.defaultdict(list)
dict2 = collections.defaultdict(int)
wind , overl, maxim= int(sys.argv[1]),int(sys.argv[2]),int(sys.argv[4])
for line in open(sys.argv[3]):
try : set1.add(line.split()[1])
except : pass
for i in xrange(1,maxim,wind-overl):
if int(line.split()[0]) in xrange(i,wind+i): dict1[i].append(line)
print "Window\tTotal\t",
for entri in set1 : print entri,"\t",
print "\n",
for j in xrange(1,maxim,wind-overl):
dict2.clear()
for line in dict1[j]:
try : dict2[line.split()[1]] +=1
except: pass
print j,"\t",len(dict1[j]),"\t",
for entri in set1:
print dict2[entri],"\t",
print "\n",
用法:python script.py 窗口重叠文件格式
其中,maxim表示输入文件中的最大整数。样本输入文件中的maxim = 168153。将其作为命令行参数可以提高计算速度。