Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 根据另一个文件中的匹配条件筛选一个文件中的行的awk代码_R_Awk - Fatal编程技术网

R 根据另一个文件中的匹配条件筛选一个文件中的行的awk代码

R 根据另一个文件中的匹配条件筛选一个文件中的行的awk代码,r,awk,R,Awk,我有两个文件如下所示: 文件1有511行: chr start end 1 1227897 2779043 1 6644723 8832944 1 11067792 11372913 1 17287414 17342924 1 23254576 23590651 带有12594903行的文件2: 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

我有两个文件如下所示:

文件1有511行:

chr start end
1 1227897 2779043
1 6644723 8832944
1 11067792 11372913
1 17287414 17342924
1 23254576 23590651
带有12594903行的文件2:

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
我试图删除文件2中的所有行,其中文件2中的
POS
(即位置)位于文件1的
start
end
之间,并且文件2中的
CHR
等于文件1中的
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])]
}

必须有一个整洁和快速awk一班轮这样做。但我不知道怎么做。任何帮助都将不胜感激

这里有一个非常快速和丑陋的方法。至少创建一个按所有可能性编制索引的列表:

awk '(NR==FNR) {for(i=$2;i<=$3;++i) a[$1,i]; next}(FNR==1);!(($1,$2) in a)' file1 file2
每次读取file2的新记录时,我们都将该记录存储在
t
下,并跟踪
CHR
值(
c=$1
)。通过将
a[c]
分配给
$0
我们重新计算所有字段,因此
$1=1227897
$2=2779043
,等等。因此,我们所要做的就是在所有字段上分成两组,并检查当前记录是否位于相应的范围内。如果在范围内,我们跳到下一条记录

如中所述,如果对
file2
进行排序,则可以加快速度:

 awk '(NR==FNR) { a[$1]=a[$1] FS $2 FS $3 FS a[$1]; next}
     { t=$0;c=$1;p=$2; $0=a[c] }
     { for(i=NF-1;i>0;i+=2) {
          if ( $(i+1) < p ) { $i=$(i+1)=""; $0=$0; $1=$1; a[c]=$0 }
          else if ( $i<=p && p<=$(i+1) ) { next }
          print t
     }' file1 file2
awk'(NR==FNR){a[$1]=a[$1]FS$2 FS$3 FS a[$1];next}
{t=$0;c=$1;p=$2;$0=a[c]}
{对于(i=NF-1;i>0;i+=2){
如果($(i+1)否则如果($I给定样本数据的预期输出是什么?因此,输出应该与文件2完全相同,但是那些符合条件的行应该被删除。当然,请将预期输出添加到问题中。我想与我的结果进行比较。谢谢!啊,当然。添加了预期输出!您的输出与问题相反他正在寻找。您正在打印符合条件的行,而这些行应该在更快的时间删除,非常感谢!现在我只需要升级我的awk游戏,直到我了解这里发生了什么。@kvanto我们很聪明地记录了
CHR
变量的键。一种提高对数速度的方法是剔除散列m当一条记录“
POS
超出一对范围时,范围的ap。例如,一旦到达
POS
等于
6702159
的记录,您就可以从
a[1]中删除范围对
1227897 2779043
这样您就不必再将更多记录与之进行比较了。这只适用于按
POS
对文件2进行排序的情况,但从我们提供的示例文件来看似乎是这样的。@SiegeX谢谢。我已经为其添加了一个更新。由于字段如何重新定义$0,我不得不做一些hocus pocus来获得所需的结果,但我认为这应该是正确的做它。@kvantour@SiegeX是的,文件2确实是按
CHR
POS
排序的,谢谢,似乎工作正常,但并不比我的R代码快。
awk '(NR==FNR) { a[$1]=a[$1] FS $2 FS $3; next}
     { t=$0;c=$1;p=$2; $0=a[c] }
     { for(i=1;i<=NF;i+=2) if( $i<=p && p<=$(i+1) ) next; print t }' file1 file2
a[1] = "1227897 2779043 6644723 8832944 11067792 11372913"
 awk '(NR==FNR) { a[$1]=a[$1] FS $2 FS $3 FS a[$1]; next}
     { t=$0;c=$1;p=$2; $0=a[c] }
     { for(i=NF-1;i>0;i+=2) {
          if ( $(i+1) < p ) { $i=$(i+1)=""; $0=$0; $1=$1; a[c]=$0 }
          else if ( $i<=p && p<=$(i+1) ) { next }
          print t
     }' file1 file2
awk '
  NR==FNR{
    a[$2","$3]=$1
    next
  } 

  {
    for(i in a){
      split(i,b,",")
      if($1 == a[i] && $2 >= b[1] && $2 <= b[2]){next}
    }
  }1
' file1 file2
$ cat file2
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
2 23364524 C G 377155 0.00505093 0.00588132 0.390447 0.0368034 rs2977670

$ awk 'NR==FNR{a[$2","$3]=$1;next}{for(i in a){split(i,b,",");\
         if($1 == a[i] && $2 >= b[1] && $2 <= b[2]){next}}}1' file1 file2
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
2 23364524 C G 377155 0.00505093 0.00588132 0.390447 0.0368034 rs2977670