awk/grep根据文件1中匹配的字符串列表打印文件2中的整个记录

awk/grep根据文件1中匹配的字符串列表打印文件2中的整个记录,awk,sed,grep,pattern-matching,Awk,Sed,Grep,Pattern Matching,这个问题在stackoverflow上比较流行。我已经浏览了以前的帖子,但没有找到我需要的解决方案 我有两个文件。一个文件是字符串标识符列表,另一个是条目列表。我想将file1列表中的每个项目与file2中的一个条目进行匹配,然后在file2中打印整个匹配记录。我目前的问题是,我只能打印文件2的第一行(而不是整个记录) 示例: File1 id100 id000 id004 ... File2 >gnl|gene42342|rna3234| id0023 CCAATGAGA >gn

这个问题在stackoverflow上比较流行。我已经浏览了以前的帖子,但没有找到我需要的解决方案

我有两个文件。一个文件是字符串标识符列表,另一个是条目列表。我想将file1列表中的每个项目与file2中的一个条目进行匹配,然后在file2中打印整个匹配记录。我目前的问题是,我只能打印文件2的第一行(而不是整个记录)

示例:

File1
id100
id000
id004
...

File2
>gnl|gene42342|rna3234| id0023
CCAATGAGA
>gnl|gene402|rna9502| id004
AAAAAAGGGGGGGGGG
>gnl|gene422|rna22229| id100
GATTACAGATTACA
....
期望输出:

>gnl|gene402|rna9502| id004
AAAAAAGGGGGGGGGG
>gnl|gene422|rna22229| id100
GATTACAGATTACA
我当前的代码:

awk 'NR==FNR{a[$0];next}{for(i in a)if(index($0,i)){print $1 ;next}}' file1 file2
仅打印:

>gnl|gene402|rna9502| id004
>gnl|gene422|rna22229| id100
并尝试指定RS使整个文件打印…,即:

 awk 'NR==FNR{a[$0];next}{for(i in a)if(index($0,i)){RS=">"}{print $1 ;next}}' file1 file2
印刷品

>gnl|gene42342|rna3234| id0023
CCAATGAGA
>gnl|gene402|rna9502| id004
AAAAAAGGGGGGGGGG
>gnl|gene422|rna22229| id100
GATTACAGATTACA
....
我对
grep
也有同样的问题。第一行打印,但不是整个记录:

grep -Fwf file1 file2
给予

我觉得我只是在错误的地方定义了RS,但我不知道在哪里。欢迎任何意见

编辑:

现实生活中的文件更像这样:

awk '{print $0}' file2

>gnl|gene49202|rna95089| id0023
GGTGCTCTAGACAAAACATTGATTCCTCGTGACTGGGATTAGCCAATAGCTGAACGCGACTGAGTGTGAAACACGGAGGA
GGAGTAGGAAGTTGGAACTAGACAGGCGACTCGGTTAGGGGACACCGGAGAGATGACTCATGACTCGTGGAAACCAACGT
GAGCTTGCCCGACAAAAGAATATGAAGAAAAGTCAGGATAAACAAAAGAAACAAGATGATGGCTTGTCTGCTGCTGCACG
GAAGCACTGACCCTTTCACCAAACCACAGTGCTCTCACTGCTATGTACTGTGTTCAGcctttttatttgtcacaggCTTGTAGCAT
AGCTCCTTTATTGCCTCTTGTACATACTATAAATTCTCCATATGATTCTCTTTATTTTCATCTATTCCCCACTGATGGCT
CTCTAACTGCATGCTGGTTTAGCATTGCTTAAGTCTGCTCTGGAAAATACATGTTTTGAGGGAGTACAAACAGATCATGT
CCCTTCCTTCAACTCAAATGACCTTTTTGTATTCACGGTGACCCAGttgaatatttaataaagaatttttttctgtga

>gnl|gene37771|rna78596| id230400
GGCGATACTAGATGTTGGCGGGGTTACACTGTAGATGCGGGGGGGCTACACTAGATGTGGGCGAGGCTACACTGCAGATG
TGGGCAAGGCTATACTAGATGTGGGTGGGGCTACACTGTAGATGTGGGTGGGGCTACACTTCAGATGTGGGCGAGGCTAT
ACTGTAGATGTGGGCTGAATTTCCTATAAAGCCTGTACCTTCTTTGTTTTTGCAGGGCTTGATGGCAGAATGGAGCAGCC
AGAGCTACAGAGTGGATGACCCAGATTTGGCCCTAACCTTTCCCACCCGGCCTGGTTTCCGTAGCTTTCCCAGTCCCCAA
GTCTTTCCTATTTTCTCCCTCTTGCCACAATCTGATCCCTGCAGTAACAATGAGCTGGTTGAGTAAACTTAACCCTCGGG
GAGCTGGCGGCAGGGCCAAGTGTCAGTCTCCAACCGCCGCTCACTGCC
编辑:由于OP更改了输入文件,因此根据新输入,我现在正在编写此代码

awk -F"| " 'FNR==NR{a[$0];next} /^>/{flag=""} ($NF in a){flag=1} flag' FILE1  FILE2

下面的
awk
可能会对您有所帮助

awk 'FNR==NR{a[$0];next} ($3 in a){print $0;getline;print}' Input_file1 FS="|" Input_file2

如果您的记录被一个或多个空行分隔,那么这应该是可行的

$ awk -v ORS='\n\n' 'NR==FNR{a[$1]; next} $2 in a' file1 RS= file2
这里的输出也用一个空行分隔,如果要删除空行,只需删除
-v ORS='\n\n'

$ grep -A1 -Fwf file1 file2
>gnl|gene402|rna9502| id004
AAAAAAGGGGGGGGGG
>gnl|gene422|rna22229| id100
GATTACAGATTACA
-A1
表示“比赛后也显示1A”。检查你的grep手册页


如果尾随信息是固定行数,则相应地调整“1”。否则您将需要awk或perl或。。。寻求更灵活的解决方案。

运气不好,但谢谢!没有指纹。可能在真实文件中,第二个条目(即:AAGGAGAG)更长,跨越多行?而且a也不一定总是完美的!非常感谢。您好,您可能有兴趣使用一个名为的awk派生,它似乎能够理解这些fasta文件格式。这是一个非常有趣的消息…:)
$ grep -A1 -Fwf file1 file2
>gnl|gene402|rna9502| id004
AAAAAAGGGGGGGGGG
>gnl|gene422|rna22229| id100
GATTACAGATTACA