【问题标题】:awk/grep print WHOLE record in file2 based on matched string list in file1awk/grep 根据 file1 中的匹配字符串列表在 file2 中打印整个记录
【发布时间】:2018-11-08 05:01:44
【问题描述】:

这个问题在 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

【问题讨论】:

  • 嗨,您可能有兴趣使用名为 bioawk 的 awk 派生,它似乎能够理解这些 fasta 文件格式。
  • 这是一个非常有趣的消息... :)

标签: awk sed grep pattern-matching


【解决方案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

【讨论】:

  • 不走运,但谢谢!什么都没有打印。可能在真实文件中,第二个条目(即:AAGGAGAG)更长,跨越多行?也不能保证 a 总是在第三列
  • 完美!谢谢!
【解决方案2】:

如果您的记录被一个或多个空行分隔,这应该可以工作。

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

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

【讨论】:

    【解决方案3】:
    $ grep -A1 -Fwf file1 file2
    >gnl|gene402|rna9502| id004
    AAAAAAGGGGGGGGGG
    >gnl|gene422|rna22229| id100
    GATTACAGATTACA
    

    -A1 的意思是“在比赛结束后也显示 1A”。检查您的 grep 手册页。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-04
      • 1970-01-01
      • 1970-01-01
      • 2021-06-27
      • 2020-10-15
      • 2016-01-02
      • 2017-09-07
      • 1970-01-01
      相关资源
      最近更新 更多