我有一个巨大的文件,其中包含 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