python - 如果它们满足一定范围,如何打印行
问题描述
我有两个如下所示的巨型文件:
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
我想要做的是在文件 1 的单独列中打印文件 2 的行,如果 file2 的范围start
和end
列在 file1 的范围内(第 2 列和第 3 列)并且chr
是相同的。所以基于我提供的虚拟示例文件 - 所需的输出应该是(只有文件1linc1320
的第一行中的范围):
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"
我不是专业的编码员,但我一直在使用此代码根据 file2 手动更改范围:
awk -F ',' '$2<=3073300,$3>=3074300, {print $1,$2,$3,$4,$5,$6,$7}' f1.csv
我对使用特定的编程语言没有特别的偏好——两者Python
都会awk
非常有帮助。感谢您提供任何帮助。
解决方案
你可以使用这个awk
:
awk 'BEGIN{FS=OFS=","} FNR==NR {if (FNR>1) {chr[++n] = $1; id[n]=$2; r1[n]=$3; r2[n]=$4}; next} {for (i=1; i<=n; ++i) if ($1 == chr[i] && r1[i] > $2 && r2[i] < $3) {$0 = $0 OFS id[i] OFS r1[i] OFS r2[i]; break}} 1' file2 file1
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"
更易读的形式:
awk '
BEGIN { FS = OFS = "," }
FNR == NR {
if (FNR > 1) {
chr[++n] = $1
id[n] = $2
r1[n] = $3
r2[n] = $4
}
next
}
{
for (i=1; i<=n; ++i)
if ($1 == chr[i] && r1[i] > $2 && r2[i] < $3) {
$0 = $0 OFS id[i] OFS r1[i] OFS r2[i]
break
}
} 1' file2 file1
推荐阅读
- db2 - 主服务器和备用服务器上的 DB2 HADR 同步模式不同
- python - 如何使用 Pandas 提取 2 次之间的行?
- azure - 我可以从 Azure 门户查看我的虚拟机上的数据吗?
- python - Python中的日志记录模块可以在没有格式字符串的情况下注销数据
- c++ - c++ 只关心 2 位小数 w/o setprecision
- android - 无法显示我的 Textview1 和 Textview2 之间的计算时间差?
- python - 使用 python-docx 批量处理许多数据并生成报告。但是doc文件包含以前数据文件的分析结果
- amazon-redshift - 在 Redshift 上使用大量 JOINS 优化非常长的代码
- javascript - 表单 - 未转移到 PHP 的清单值
- oracle12c - 何时在 RANGE INTERVAL 分区中创建本地和全局索引