Awk 从另一个文件中获取一个图案时打印两个图案之间的线条

Awk 从另一个文件中获取一个图案时打印两个图案之间的线条,awk,sed,Awk,Sed,我有一个问题要解决,但我自己无法解决 包含ID的文件1,看起来像: >AIM49244.1 >NP_722551.1 >YP_002790883.1 >AGS41451.1 >AIM49245.1 >BAM74427.1 >CCC55433.1 文件2看起来像: >AIM49244.1 polyprotein [Aedes flavivirus] (several lines of text only Alphabetic) >NZ_039

我有一个问题要解决,但我自己无法解决

包含ID的文件1,看起来像:

>AIM49244.1
>NP_722551.1
>YP_002790883.1
>AGS41451.1
>AIM49245.1
>BAM74427.1
>CCC55433.1
文件2看起来像:

>AIM49244.1 polyprotein [Aedes flavivirus]
(several lines of text only Alphabetic)
>NZ_03930.3 polyprotein [please help]
(several lines of text only Alphabetic)
>NP_722551.1 polyprotein [Alkhumra hemorrhagic fever virus]
(several lines of text only Alphabetic)
>NP_123456.7 polyprotein [Foo bar Foo bar]
several lines of text
and so on
对于文件1中的ID,我想提取包含ID的标题以及文件2中的以下几行文本,直到下一个ID开始

输出文件的示例结果:

>AIM49244.1 polyprotein [Aedes flavivirus]
(several lines of text only Alphabetic)
>NP_722551.1 polyprotein [Alkhumra hemorrhagic fever virus]
(several lines of text only Alphabetic)
我有一个解决方案,但只有在文件2中,描述行(以>)后面只跟一行时,它才起作用

awk 'FNR==NR{A[$1]=$1; next}$1 in A{print $0, getline; print $0}' File_1 File_2

但是我不能熟练地处理这个新问题。我试图让它与范围模式,但它不是正常工作。因此,如果您能帮助我,那就太好了:)

不要使用
getline
,除非您有非常特殊的需要,并且完全理解所有的含义和注意事项。看

在这种情况下,您只需要:

awk '
NR==FNR { ids[$1]; next }
/^>/ { inTargetBlock = ($1 in ids ? 1 : 0) }
inTargetBlock
' file1 file2

这看起来像fasta文件。不能只在ids中
inTargetBlock=$1
IMHO,因为它不太清晰,所以不值得保存这两个字符。谢谢。它工作得很好。至于getline,我知道它可以做很多事情,但它以这种方式为我工作。但如果我有时间,我会看看它的所有功能。不客气,但我想你误解了我的观点-我不是建议你多使用getline,我是说少使用它(几乎从不)。关于你的答案,我有一个问题。很抱歉现在就来了,但周五我有点赶时间。我真的不明白您的代码如何能够在>(标题)之后打印出文本行
NR==FNR{ids[$1];next}
将第一个文件中的所有ID放入数组
/^>/{inTargetBlock=(ids中的$1?1:0)}inTargetBlock
正在搜索以>开头的行,然后根据该行是否在ids数组中,将inTargetBlock设置为1或0。如果设置为inTargetBlock,则会导致打印该行。但是下面的文本是如何打印的?