【问题标题】:egrep command to find substrings whose length is multiple of 3egrep 命令查找长度为 3 的倍数的子字符串
【发布时间】:2019-10-22 04:57:59
【问题描述】:

我想知道你能不能告诉我在一个包含字符 A、C、G、T 并且长度是 3 的倍数的 txt 文件中查找子字符串的命令是什么

我的命令是这样的

egrep "[ACGT]" dna.txt

但我仍然坚持使用 3 部分的倍数。我想我将不得不使用{},但我不知道如何。

【问题讨论】:

  • 如果一行包含字符串 TACA(长度为 4)应该输出什么?

标签: linux shell command


【解决方案1】:

为了重新表述您的要求,您需要一个或多个重复的三个匹配序列。

grep -E -x '([ACGT]{3})+' dna.txt

更详细地说,括号用于分组,因此最后的+(一个或多个)适用于整个组;在组内,简单的表达式[ACGT]{3} 匹配三个相邻的字符,每个字符都可以是字符类枚举中的任意一个。

grep 默认打印出任何包含匹配的子字符串的行; -x 要求整行匹配。

grep -E 的同义词 egrep 已过时,今后应该避免使用。

【讨论】:

  • 我明白了。谢谢!我想知道这两者有什么区别?我的班级正在使用 egrep。我的教授说它们可以互换
  • 是的,正如已经说明的那样,它们是同义词,但egrep 是一个遗留术语,它将继续有效,但不应该教给初学者。也许提示您的教授查看 POSIX 规范。另见unix.stackexchange.com/questions/17949/…
【解决方案2】:

请注意,普通的旧 grep 可以做到这一点,尽管更冗长:

grep -o '[ACGT][ACGT][ACGT]' <<< TACA

输出:

TAC

【讨论】:

  • 只是为了好玩,看看bash手册的DNA:man bash | tr '[a-z]' '[A-Z]' | grep -o '[ACGT][ACGT][ACGT]' | xargs echo
  • 当然,提取任何三组,而不是包含三的倍数的行。 POSIX grep BRE 语法支持 \([ACGT]\{3\}\)\+,它古怪且不优雅,但可以合理地移植到当前的千禧年。
  • tr 的参数中的方括号并没有错(因为您将[ 转换为[] 转换为]),但完全是多余的
  • @tripleee,是的,但 OP 将 substrings 指定为作为某些未定义文件结构的一部分的输入。无论如何,对于整个行,有grep '^[ACGT][ACGT][ACGT]$'
  • 或等同于grep -x,如我的回答。
猜你喜欢
  • 2013-05-03
  • 2015-09-02
  • 2022-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-24
相关资源
最近更新 更多