Awk 从另一个文件中删除与特定图案匹配的行

Awk 从另一个文件中删除与特定图案匹配的行,awk,grep,fasta,Awk,Grep,Fasta,我有两个文件(我只显示这些文件的开头): patterns.txt m64071_201130_104452/13 m64071_201130_104452/26 m64071_201130_104452/46 m64071_201130_104452/49 m64071_201130_104452/113 m64071_201130_104452/147 myfile.txt >m64071_201130_104452/13/ccs ACAGTCGAGCG >m64071_201

我有两个文件(我只显示这些文件的开头):

patterns.txt

m64071_201130_104452/13
m64071_201130_104452/26
m64071_201130_104452/46
m64071_201130_104452/49
m64071_201130_104452/113
m64071_201130_104452/147
myfile.txt

>m64071_201130_104452/13/ccs
ACAGTCGAGCG
>m64071_201130_104452/16/ccs
ACAGTCGAGCG
>m64071_201130_104452/20/ccs
CAGTCGAGCGC
>m64071_201130_104452/22/ccs
CACACATCTCG
>m64071_201130_104452/26/ccs
TAGACAATGTA
我应该得到这样的输出:

>m64071_201130_104452/13/ccs
ACAGTCGAGCG
>m64071_201130_104452/26/ccs
TAGACAATGTA
如果patterns.txt中的行与myfile.txt中的行匹配,我想创建一个新文件。我需要保持字母ACTG与所讨论的模式相关。我使用:

for i in $(cat patterns.txt); do 
     grep -A 1 $i myfile.txt; done > my_newfile.txt
它可以工作,但是创建新文件的速度非常慢。。。我处理的文件相当大,但不太多(patterns.txt为14M,myfile.txt为700M)

我还尝试使用
grep-v
,因为我有另一个文件,其中包含patterns.txt中不存在的myfile.txt的其他模式。但这是同样的“快速填充文件”问题


如果您看到一个解决方案,请尝试以下内容。用GNU
awk
编写和测试

awk '
FNR==NR{
  arr[$0]
  next
}
/^>/{
  found=0
  match($0,/.*\//)
  if((substr($0,RSTART+1,RLENGTH-2)) in arr){
    print
    found=1
  }
  next
}
found
'  patterns.txt myfile.txt
说明:添加上述内容的详细说明

awk '                         ##Starting awk program from here.
FNR==NR{                      ##Checking condition which will be TRUE when patterns.txt is being read.
  arr[$0]                     ##Creating array with index of current line.
  next                        ##next will skip all further statements from here.
}
/^>/{                         ##Checking condition if line starts from > then do following.
  found=0                     ##Unsetting found here.
  match($0,/.*\//)            ##using match to match a regex to till / in current line.
  if((substr($0,RSTART+1,RLENGTH-2)) in arr){  ##Checking condition if sub string of matched regex is present in arr then do following.
    print                     ##Printing current line here.
    found=1                   ##Setting found to 1 here.
  }
  next                        ##next will skip all further statements from here.
}
found                         ##Printing the line if found is set.
'  patterns.txt myfile.txt    ##Mentioning Input_file names here.
另一个awk:

$ awk -F/ '                            # / delimiter
NR==FNR {
    a[$1,$2]                           # hash patterns to a
    next
}
{
    if( tf=((substr($1,2),$2) in a) )  # if first part found in hash
        print                          # output and store found result in var tf
    if(getline && tf)                  # read next record and if previous record was found
        print                          # output
}' patterns myfile
输出:

>m64071_201130_104452/13/ccs
ACAGTCGAGCG
>m64071_201130_104452/26/ccs
TAGACAATGTA
>m64071_201130_104452/16/ccs
ACAGTCGAGCG
>m64071_201130_104452/20/ccs
CAGTCGAGCGC
>m64071_201130_104452/22/ccs
CACACATCTCG
编辑:要输出未找到的,请执行以下操作:

$ awk -F/ '                              # / delimiter
NR==FNR {
    a[$1,$2]                             # hash patterns to a
    next
}
{
    if( tf=((substr($1,2),$2) in a) ) {  # if first part found in hash
        getline                          # consume the next record too
        next
    }
    print                                # otherwise output
}' patterns myfile
输出:

>m64071_201130_104452/13/ccs
ACAGTCGAGCG
>m64071_201130_104452/26/ccs
TAGACAATGTA
>m64071_201130_104452/16/ccs
ACAGTCGAGCG
>m64071_201130_104452/20/ccs
CAGTCGAGCGC
>m64071_201130_104452/22/ccs
CACACATCTCG

请将该示例输入的所需输出(无说明)添加到问题中(无注释)。以字节为单位。下面的评论回答了我的问题。@tripleee,满怀敬意;我想在这里提出这一点,IMHO添加的链接肯定可以提供这样做的逻辑(在某种程度上),但这不是一个完全重复的问题(因为OP的数据不同于所附链接中显示的数据);所以我现在重新开始这个问题,谢谢。@tripleee,IMHO,duplicate的意思是“精确的复制”,不像它只提供了一点指导。否则,如果不完全是欺骗的话,就把任何东西欺骗是没有意义的。我也赞成让一个问题被愚弄,但它究竟是什么时候被愚弄的。我觉得在重新打开这一页之前,我已经礼貌地保留了我的观点,谢谢。@tripleee,我不是指逐字复制(当然我们都理解它,我们在这里看到的是逻辑方面的东西,而不是逐行),这里的逻辑对于附件和这一页也是不同的。如果你比较一下这里和那里的问题和答案,我想我不需要再多解释了,谢谢你。@Paillou是的,我想颠倒这个过程就可以了。给我一点时间。@Paillou检查我的编辑。也许有更好的方法,但我正在做别的事情。