我有两个大文件,如下所示:
f1:
chr1,3073253,3074322,gene_id,"ENSMUSG00000102693.1",gene_type,"TEC"
chr1,3074253,3075322,gene_id,"ENSMUSG00000102693.1",transcript_id,"ENSMUST00000193812.1"
chr1,3077253,3078322,gene_id,"ENSMUSG00000102693.1",transcript_id,"ENSMUST00000193812.1"
chr1,3102916,3103025,gene_id,"ENSMUSG00000064842.1",gene_type,"snRNA"
chr1,3105016,3106025,gene_id,"ENSMUSG00000064842.1",transcript_id,"ENSMUST00000082908.1"
f2层:
chr,name,start,end
chr1,linc1320,3073300,3074300
chr3,linc2245,3077270,3078250
chr1,linc8956,4410501,4406025
如果 start
以及 end
file2的列在file1的范围内(列2和3)和 chr
是一样的。因此,根据我提供的虚拟示例文件,所需的输出应该是(只有 linc1320
在file1的第一行中,并且 linc2245
位于文件的第三行(1):
chr1,3073253,3074322,gene_id,"ENSMUSG00000102693.1",gene_type,"TEC",linc1320,3073300,3074300
chr1,3074253,3075322,gene_id,"ENSMUSG00000102693.1",transcript_id,"ENSMUST00000193812.1"
chr1,3077253,3078322,gene_id,"ENSMUSG00000102693.1",transcript_id,"ENSMUST00000193812.1"
chr1,3102916,3103025,gene_id,"ENSMUSG00000064842.1",gene_type,"snRNA"
chr1,3105016,3106025,gene_id,"ENSMUSG00000064842.1",transcript_id,"ENSMUST00000082908.1"
我不是一个专业的编码器,但我一直在使用此代码手动更改基于文件2的范围:
awk -F ',' '$2<=3073300,$3>=3074300, {print $1,$2,$3,$4,$5,$6,$7}' f1.csv
我对使用特定的编程语言没有特别的偏好-两者都有 Python
以及 awk
会很有帮助的。谢谢你的帮助。
3条答案
按热度按时间kmpatx3s1#
你可以用这个
awk
:更具可读性的形式:
w8ntj3qf2#
编辑:通过op的编辑输入,你可以尝试以下内容。即使文件2中的字段超过4个,也可以这样做。
有了你们展示的样品,你们能试一下吗。用gnu编写和测试
awk
,应该在任何情况下工作awk
. 参考阿努巴瓦的回答。说明:增加了对以上内容的详细说明。
fdbelqdn3#
让我们试着解决这个问题
pandas
对了,先看一下csv
将文件放入pandas
Dataframe现在我们可以了
merge
以及filter
满足给定区间包含条件的行join
与文件一起筛选的行f1
```m = f1.reset_index()
.merge(f2, left_on=0, right_on='chr')
.where(lambda x: x[1].le(x['start']) & x[2].ge(x['end']))
.set_index('index')'name', 'start', 'end'
f3 = f1.join(m)
0 chr1 3073253 3074322 gene_id ENSMUSG00000102693.1 gene_type TEC linc1320 3073300.0 3074300.0
1 chr1 3074253 3075322 gene_id ENSMUSG00000102693.1 transcript_id ENSMUST00000193812.1 NaN NaN NaN
2 chr1 3077253 3078322 gene_id ENSMUSG00000102693.1 transcript_id ENSMUST00000193812.1 NaN NaN NaN
3 chr1 3102916 3103025 gene_id ENSMUSG00000064842.1 gene_type snRNA NaN NaN NaN
4 chr1 3105016 3106025 gene_id ENSMUSG00000064842.1 transcript_id ENSMUST00000082908.1 NaN NaN NaN