我有两个大文件,如下所示:
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
我想做的是,如果file2的start
和end
列的范围在file1(第2列和第3列)和chr
的范围内,则在file1中的单独列中打印file2的行。因此,根据我提供的虚拟示例文件,所需的输出应该是(只有linc1320
的范围在文件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
都会很有帮助。谢谢你的帮助
编辑:使用OP编辑的输入,可以尝试以下操作。即使文件2中的字段超过4个,也可以这样做
有了你们展示的样品,你们能试一下下面的吗。用GNU
awk
编写和测试,应该可以在任何awk
中使用。参考anubhava的回答解释:添加上述内容的详细解释
您可以使用此
awk
:更具可读性的表格:
让我们尝试以
pandas
的方式解决问题,首先将csv
文件读入pandas
数据帧现在我们可以
merge
和filter
满足给定区间包含条件的行,然后我们可以join
使用文件f1
过滤行PS:您还可以使用
f3.to_csv('file3.csv')
将生成的数据帧f3
保存到csv文件相关问题 更多 >
编程相关推荐