grep 模式与文件完全匹配并仅在第一列中搜索

grep 模式与文件完全匹配并仅在第一列中搜索

我有一个像这样的大文件:

denovo1 xxx yyyy oggugu ddddd
denovo11 ggg hhhh bbbb gggg
denovo22 hhhh yyyy kkkk iiii
denovo2 yyyyy rrrr fffff jjjj
denovo33 hhh yyy eeeee fffff

那么我的模式文件是:

denovo1
denovo3
denovo22

我正在尝试使用fgrep以便仅提取与我的文件中的模式完全匹配的行(所以我想要denovo1但不denovo11)。我尝试使用-x精确匹配,但后来得到一个空文件。我试过:

fgrep -x --file="pattern" bigfile.txt > clusters.blast.uniq

有没有办法让 grep 只在第一列搜索?

答案1

您可能想要-w国旗 - 来自man grep

   -w, --word-regexp
          Select  only  those  lines  containing  matches  that form whole
          words.  The test is that the matching substring must  either  be
          at  the  beginning  of  the  line,  or  preceded  by  a non-word
          constituent character.  Similarly, it must be either at the  end
          of  the  line  or  followed by a non-word constituent character.
          Word-constituent  characters  are  letters,  digits,   and   the
          underscore.

IE

grep -wFf patfile file
denovo1 xxx yyyy oggugu ddddd
denovo22 hhhh yyyy kkkk iiii

要仅在第一列中强制匹配,您需要修改模式文件中的条目以添加线锚:您还可以使用\b锚这个词来代替命令行-w开关,例如patfile

^denovo1\b
^denovo3\b
^denovo22\b

然后

grep -f patfile file
denovo1 xxx yyyy oggugu ddddd
denovo22 hhhh yyyy kkkk iiii

-F请注意,如果文件包含正则表达式而不是简单的固定字符串,则必须删除该开关。

答案2

也可以使用 awk:

awk 'NR==FNR{a[$0]=$0}NR>FNR{if($1==a[$1])print $0}' pattern_file big_file

输出:

denovo1 xxx yyyy oggugu ddddd
denovo22 hhhh yyyy kkkk iiii

相关内容