如何使用 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/ 是不对的......有人可以帮助我使用这个正则表达式吗?
我认为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
- 这是根本不需要的。