如何使用 grep 查找序列中的特定字母

How to grep specific letters in a sequence using grep

我有一个包含这种形式信息的文件:

>scaffold1|size69534
ACATAAGAGSTGATGATAGATAGATGCAGATGACAGATGANNGTGANNNNNNNNNNNNNTAGAT
>scaffold2|size68281
ATAGAGATGAGACAGATGACAGANNNNAGATAGATAGAGCAGATAGACANNNNAGATAGAG
>scaffold3|size67203
ATAGAGTAGAGAGAGAGTACAGATAGAGGAGAGAGATAGACNNNNNNACATYYYYYYYYYYYYYYYYY
>scaffold4|size66423
ACAGATAGCAGATAGACAGATNNNNNNNAGATAGTAGACSSSSSSSSSS

等等

但是我猜这个序列有些不正常,所以我想grep scaffold后所有行中所有不是A,C,T,G或N的字母 (我只想在序列不在 >scaffold-size 行中的行中搜索)。
在上面的示例中,它将在 scaffold3 之后 grep YYYYYYYYYYYYYYYYY 并在 scaffold 4 中使用 SSSSSSSSSSSSS。
我希望我已经足够清楚了,如果您需要任何说明,请告诉我。

谢谢

使用 grep -v 删除脚手架行,并使用 grep -oP select 不需要的字母段。

cat test.txt | grep -v '^>' | grep -oP '[^ACGTN]+'

示例数据的输出

S
YYYYYYYYYYYYYYYYY
SSSSSSSSSS

你能不能试试看,考虑到你不想要空行然后试试看。

awk '!/^>/{gsub(/[ACTGN]/,"");if(NF){print}}'  Input_file

说明:在此处添加以上代码的详细说明。

awk '                    ##Starting awk program from here.
!/^>/{                   ##Checking condition if a line does not starts from > then do following.
  gsub(/[ACTGN]/,"")     ##Globally substituting A,C,T,G,N will NULL in lines here.
  if(NF){                ##Checking condition if current is NOT NULL after substitution then do following.
    print                ##Print the current line.
  }
}
'  Input_file            ##Mentioning Input_file name here.

输出如下。

S
YYYYYYYYYYYYYYYYY
SSSSSSSSSS

假设您不仅需要知道哪些序列包含无效字符 - 您还想知道每个序列属于哪个支架。这是可以做到的;如何做到这一点取决于您需要的确切输出格式,以及数据的确切结构。

为了说明,我将做以下简化假设:"sequences" 可能只包含大写字母(可能是有效的 无效的 - 但不能有标点符号或数字等);并且标签(以 > 开头的行)不包含任何大写字母。注意 - 如果序列只包含字母,那么预处理文件以将序列转换为全大写并将标签转换为全小写并不难,因此下面的解决方案仍然有效。

在某些版本的 GREP 中,无效字符将以不同颜色显示(请参阅链接图像)。我觉得这很有帮助。

grep --no-group-separator -B 1 '[BDEFHIJKLMOPQRSUVWXYZ]' input_file

输出:

>scaffold1|size69534
ACATAAGAGSTGATGATAGATAGATGCAGATGACAGATGANNGTGANNNNNNNNNNNNNTAGAT
>scaffold3|size67203
ATAGAGTAGAGAGAGAGTACAGATAGAGGAGAGAGATAGACNNNNNNACATYYYYYYYYYYYYYYYYY
>scaffold4|size66423
ACAGATAGCAGATAGACAGATNNNNNNNAGATAGTAGACSSSSSSSSSS