【发布时间】:2020-05-14 03:59:29
【问题描述】:
我有两个如下所示的文件:
file1 有 511 行:
chr start end
1 1227897 2779043
1 6644723 8832944
1 11067792 11372913
1 17287414 17342924
1 23254576 23590651
file2 有 12594903 行:
CHR POS REF A1 OBS_CT BETA SE P ALT_FREQS RSID_UKB
1 58396 T C 382851 0.0882097 0.0677502 0.192923 0.000249012 rs570371753
1 91588 G A 382852 0.265908 0.0879796 0.00250811 0.000148375 rs554639997
1 713979 C G 382837 0.00630607 0.0925289 0.945664 0.000138059 rs117217250
1 715265 C T 377557 0.00260829 0.00617561 0.672768 0.0331599 rs12184267
1 715367 A G 377954 0.00212642 0.00615857 0.729886 0.0333038 rs12184277
1 717485 C A 377980 0.00449142 0.00615965 0.465899 0.0332908 rs12184279
1 6702159 G T 378749 0.00305772 0.00604916 0.613223 0.0345562 rs116801199
1 9902231 G C 378573 0.00216983 0.00607117 0.720793 0.0342995 rs12565286
1 23364524 C G 377155 0.00505093 0.00588132 0.390447 0.0368034 rs2977670
我正在尝试删除 file2 中的所有行,其中 file2 中的 POS(即位置)位于 file1 的 start 和 end 之间,并且 file2 中的 CHR 等于 file1 中的 chr .我可以用 R 和下面的代码做到这一点,但它需要大约。以这种方式运行它需要 1 小时:
for (row in 1:nrow(file1)) {
file2 <- file2[!(file2$CHR == file1$chr[row] &
file2$POS >= file1$start[row] &
file2$POS <= file1$end[row])]
}
输出应如下所示,删除了满足条件的 2 行(第 7 行和第 9 行):
CHR POS REF A1 OBS_CT BETA SE P ALT_FREQS RSID_UKB
1 58396 T C 382851 0.0882097 0.0677502 0.192923 0.000249012 rs570371753
1 91588 G A 382852 0.265908 0.0879796 0.00250811 0.000148375 rs554639997
1 713979 C G 382837 0.00630607 0.0925289 0.945664 0.000138059 rs117217250
1 715265 C T 377557 0.00260829 0.00617561 0.672768 0.0331599 rs12184267
1 715367 A G 377954 0.00212642 0.00615857 0.729886 0.0333038 rs12184277
1 717485 C A 377980 0.00449142 0.00615965 0.465899 0.0332908 rs12184279
1 9902231 G C 378573 0.00216983 0.00607117 0.720793 0.0342995 rs12565286
必须有一个简洁快速的 awk 单行代码来执行此操作。不过,我不知道怎么做。任何帮助将不胜感激!
【问题讨论】:
-
给定样本数据的预期输出是什么?
-
所以输出应该和file2一模一样,但是那些符合条件的行应该被删除。
-
好的,请将预期的输出添加到问题中。我想要一些东西来比较我的结果。谢谢!
-
啊,当然。已添加预期输出!