选择显示变化的线条的方法

选择显示变化的线条的方法

我有一个巨大的文件,其中包含 80 个基因组和 5 条染色体。我想知道是否有一种简单的方法可以仅选择来自一条染色体(例如 1)的线,但仅选择显示 SNP 变异的位置。

1   180754  GGGGGGGCC   
1   180755  CCCCCCCCC

1   180756  CCTCCCCTC   
1   180757  AAAAAAAAA   
1   180759  TTTTTTTTT   
3   7874113 TTTTTTTTT   
3   7874114 GGGGGGGGG   
3   7874115 GGGGGGGGG   
3   7874116 GGGGGGGGG

这就是我最终想要得到的:

1   180754  GGGGGGGC        
1   180756  CCTCCCCT    

答案1

对于你的例子:

egrep '1 [[:digit:]]+ (GGGGGGGC|CCTCCCCT)' file

--- 编辑:所以试试这个:

egrep -v '([A-Z])\1{8}' data

答案2

根据您提供的示例数据,您可以使用 来执行此操作grep。鉴于核苷酸的唯一有效值是 A、C、G、T,我们可以仅包含这些值来创建一组字符。

$ grep -Ev '([ACGT])\1{8}|^$' sample.txt 
1   180754  GGGGGGGCC
1   180756  CCTCCCCTC

这是通过忽略所有单一类型的结果来实现的。正则表达式[ACGT]\1{8}匹配所有格式为 AAAAAAAA、CCCCCCCC 等的字符串。匹配的反转是通过-v开关完成的。

   -v, --invert-match
        Invert the sense of matching, to select non-matching lines.  (-v 
        is specified by POSIX.)

使用-E使我们的参数成为与grep上面匹配的正则表达式,[ACGT]\1{8}或空行(^$)。

   -E, --extended-regexp
        Interpret PATTERN as an extended regular expression (ERE, see 
        below).  (-E is specified by POSIX.)

两个参数之间的竖线(又名竖线 ( |))使 this 成为 this或者那种匹配情况。

例如grep -Ev "arg1|arg2" <file>arg1会是[ACGT]\1{8}一会儿。arg2^$

答案3

我不确定你到底在问什么(解释你的要求会很有帮助从词汇上来说而不是语义上) 但

sed -r sed -r '/^[0-9]+[[:space:]]+[0-9]+[[:space:]]+(.)\1+\>/d'

将删除(即不打印)第三个空格分隔字段完全由相同初始字符的重复组成的任何行,例如

$ sed -r '/^[0-9]+[[:space:]]+[0-9]+[[:space:]]+(.)\1+\>/d' genomes.txt
1   180754  GGGGGGGCC   

1   180756  CCTCCCCTC   

如果您知道只有基因组字段可以包含大写字母,那么进行更简单的表达可能是安全的

sed -r '/\<([A-Z])\1+\>/d' genomes.txt

相关内容