【问题标题】:How to grep exact matches from a file of a list of strings如何从字符串列表的文件中grep完全匹配
【发布时间】:2014-02-27 16:55:47
【问题描述】:

我有一个文件 A,其中有一列包含这样的字符串列表:

ADAMTS9
AIP
....

我想使用文件 A 中的字符串来 grep 文件 B 中包含它们的行,文件 B 看起来像这样:

chr13   50571142        50592603        ADAMTS9  21461   +
chr19   50180408        50191707        AIP   11299   +
chr19   50180408        50193000        AIP-S1   6532    -

我用过:

grep -F -i -w -f A B 

它能够 grep 上面的所有 3 行。但是,我只希望前两行被 grep'ed 和 AIP-S1 的第三行与 AIP 不完全匹配..

谁能告诉我如何修复命令来做到这一点?

谢谢。

【问题讨论】:

    标签: bash grep


    【解决方案1】:

    您可以使用 awk 代替:

    awk 'FNR==NR{a[$1];next} ($4 in a)' A B
    chr13   50571142        50592603        ADAMTS9  21461   +
    chr19   50180408        50191707        AIP   11299   +
    

    或在任何字段中搜索:

    awk 'FNR==NR{a[$1];next} {for (i=1; i<=NF; i++) if ($i in a) print}' A B
    

    【讨论】:

      【解决方案2】:

      您正在使用-w 进行全词搜索。问题是“AIP-S1”中的“-”字符是不是一个单词字符。所以“AIP”作为一个完整的词找到的。

      这个疯狂的命令用于将模式文件转换为包含“类似单词边界”的模式:

      $ grep -if <(sed 's/^/\\(^\\|[[:space:]]\\)/; s/$/\\($\\|[[:space:]]\\)/' A) B
      chr13   50571142        50592603        ADAMTS9  21461   +
      chr19   50180408        50191707        AIP   11299   +
      

      【讨论】:

        猜你喜欢
        • 2016-02-20
        • 2018-07-30
        • 2016-02-12
        • 1970-01-01
        • 1970-01-01
        • 2021-02-13
        • 2016-11-24
        • 1970-01-01
        • 2020-04-01
        相关资源
        最近更新 更多