如何使用 bash 或 awk 检查字符串是否至少包含一个不同于 4 的字母

Cat*_*ina 1 awk

如何使用 awk 或 bash 检查序列中至少有一个不是 A、U、C、G 字符的字母?

可以在没有典型的 for 循环的情况下完成吗?

序列示例:AUVGAU

我把这个作为输入,我应该把它拿回来,因为它有 V

输入文件看起来像这样,所以我认为 awk 会更好。

>7A0E_1|
AUVGAU
>7A0E_2|
GUCAU
Run Code Online (Sandbox Code Playgroud)

预期产出

>7A0E_1|
AUVGAU
Run Code Online (Sandbox Code Playgroud)

这是我尝试过的:

awk '!/^>/ {next}; {getline s}; s !~ /AUGC/ { print $0 "\n" s }' sample
Run Code Online (Sandbox Code Playgroud)

但显然 /AUGC/ 是不对的......有人可以帮助我使用这个正则表达式吗?

Dav*_*ica 6

我认为awk如果您想>在下一条记录不包含时有条件地输出该行,那么这是一个工具[AUCG]。您可以通过以下方式做到这一点:

awk '/^>/ {rec=$0; next} /[^AUGC]/ {printf "%s\n%s\n", rec, $0}' sample
Run Code Online (Sandbox Code Playgroud)

在你的情况下,结果是:

awk '/^>/ {rec=$0; next} /[^AUGC]/ {printf "%s\n%s\n", rec, $0}' sample
Run Code Online (Sandbox Code Playgroud)

注意:您可以使用print rec; print代替printf,但printf上面将输出减少为单个调用)

您遇到麻烦的地方是忘记保存>以然后使用开头的当前记录getline- 这是根本不需要的。

  • 它是一个“[ ... ]”字符类,将匹配其中的任何字符 - 要否定匹配,请包含扬抑符“^”作为第一个字符。(您也可以使用“!”作为第一个字符来否定匹配,但使用扬抑符更广泛使用)因此,“[^AUGC]”表示如果不包含任何这些字符,则匹配该行: )` (2认同)