awk / grep打印文件2中的整个记录​​,基于file1

时间:2018-05-29 13:50:22

标签: awk sed grep pattern-matching

这个问题在stackoverflow上有一些受欢迎程度。我已查看过以前的帖子,但无法获得我需要的解决方案。

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

示例:

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

给出

>gnl|gene402|rna9502| id004
>gnl|gene422|rna22229| id100

我觉得我只是在错误的地方定义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

3 个答案:

答案 0 :(得分:1)

编辑: 由于OP更改了Input_file,因此根据新输入我现在正在编写此代码。

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

答案 1 :(得分:0)

如果您的记录被一个或多个空行分隔,这应该有用。

$ awk -v ORS='\n\n' 'NR==FNR{a[$1]; next} $2 in a' file1 RS= file2

此处输出也用一个空行分隔,如果要删除空行,只需删除-v ORS='\n\n'

答案 2 :(得分:0)

$ grep -A1 -Fwf file1 file2
>gnl|gene402|rna9502| id004
AAAAAAGGGGGGGGGG
>gnl|gene422|rna22229| id100
GATTACAGATTACA

-A1表示“同时显示 1 A 匹配”。检查你的grep手册页。

如果尾随信息是固定数量的行,则相应地调整“1”。否则你需要awk或perl或......来获得更灵活的解决方案。