如何 grep 删除以“chr1”开头的条目,但保留以“chr11”或“chr19”开头的条目?

如何 grep 删除以“chr1”开头的条目,但保留以“chr11”或“chr19”开头的条目?

我有一个包含如下条目的文件:

chr1    740678  740720
chr1    2917480 2917507

我想删除以 or 开头的条目chr1,但保留以chr11or开头的条目chr19,依此类推。当我使用它时grep -v "chr1",它会删除以 chr11 或 chr19 开头的其他内容。我可以使用其他正则表达式吗?

答案1

首先,您应该将正则表达式锚定为仅匹配行的开头 ( ^chr1),以避免查找包含chr1但不是第一个字符串的行(例如,在带注释的 VCF 文件中很容易发生这种情况)。接下来,您可以使用-w(GNU) 的选项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.   This  option
          has no effect if -x is also specified.

如果你grep不支持,那么使用这个:

grep -v '^chr1\s' file

匹配\s空白(包括制表符和空格),因此将排除任何以空白字符开头的行chr1,然后是任何类型的空白字符。

答案2

看起来 chr1 后面有一些空格或制表符。因此,您可以搜索chr1,后面跟着一些空格字符。尝试这个:

grep -v "chr1\s\+"

相关内容