awk/grep根据文件1中匹配的字符串列表打印文件2中的整个记录
这个问题在stackoverflow上比较流行。我已经浏览了以前的帖子,但没有找到我需要的解决方案 我有两个文件。一个文件是字符串标识符列表,另一个是条目列表。我想将file1列表中的每个项目与file2中的一个条目进行匹配,然后在file2中打印整个匹配记录。我目前的问题是,我只能打印文件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
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
表示“比赛后也显示1行A”。检查你的grep手册页
如果尾随信息是固定行数,则相应地调整“1”。否则您将需要awk或perl或。。。寻求更灵活的解决方案。运气不好,但谢谢!没有指纹。可能在真实文件中,第二个条目(即:AAGGAGAG)更长,跨越多行?而且a也不一定总是完美的!非常感谢。您好,您可能有兴趣使用一个名为的awk派生,它似乎能够理解这些fasta文件格式。这是一个非常有趣的消息…:)
$ grep -A1 -Fwf file1 file2
>gnl|gene402|rna9502| id004
AAAAAAGGGGGGGGGG
>gnl|gene422|rna22229| id100
GATTACAGATTACA