我有一个像这样的大文件:
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