如果后面跟一行以相同字符开头的行,我怎么能删除一行?

时间:2017-03-12 19:32:04

标签: regex awk sed fasta reformat

我需要一些sed或awk的帮助。

如果后面跟一行以相同字符开头的行(在本例中为>),我怎么能删除一行呢?

示例我有:

>1_SRR1422294
ATCGTCAGGTAGGGTTGCGCTCGTTGCGGGACTTAACCCAACATCTCACGACACGAGCTGACGACAGCCATGCAT
>2_SRR1422294
CGTCAGACGTAGGGTTGCGCTCGTTGCGGGACTTAACCCAACATCTCACGACACGAGCTGACGACAGCCATGCAG
>5_SRR1422298
>5_SRR1422294
CGTCAGACGTAGGGTTGCGCTCGTTGCGGGACTTAACCCAACATCTCACGACACGAGCTGACGACAGCCATGCAG
>6_SRR1422294
>6_SRR1422250
TGTTCATGGTAGGGTTGCGCTCGTTGCGGGACTTAACCCACATCTCACGACACGAGCTGACGACAGCCATGCAGC
>9_SRR1422294
GCGACTAGGTAGGGTTGCGCTCGTTGCGGGACTTAACCCACATCTCACGACACGAGCTGACGACAGCCATGCAGC

我想得到这个:

>1_SRR1422294
ATCGTCAGGTAGGGTTGCGCTCGTTGCGGGACTTAACCCAACATCTCACGACACGAGCTGACGACAGCCATGCAT
>2_SRR1422294
CGTCAGACGTAGGGTTGCGCTCGTTGCGGGACTTAACCCAACATCTCACGACACGAGCTGACGACAGCCATGCAG
>5_SRR1422294
CGTCAGACGTAGGGTTGCGCTCGTTGCGGGACTTAACCCAACATCTCACGACACGAGCTGACGACAGCCATGCAG
>6_SRR1422250
TGTTCATGGTAGGGTTGCGCTCGTTGCGGGACTTAACCCACATCTCACGACACGAGCTGACGACAGCCATGCAGC
>9_SRR1422294
GCGACTAGGTAGGGTTGCGCTCGTTGCGGGACTTAACCCACATCTCACGACACGAGCTGACGACAGCCATGCAGC

请注意,并非所有行都具有相同的数字,但它们都具有相同的格式,这就是我想使用正则表达式的原因。如果你能解释如何阅读你生产的代码真的很棒。

非常感谢你!

5 个答案:

答案 0 :(得分:2)

如果整个文件遵循该模式(某些行以>开头,其中只有最后一行,后面跟一行应该始终打印),您可以使用以下内容:

awk '/^>/ { latest=$0 } !/^>/ { if (latest) { print latest; latest="" } print }'

如果该行以>开头,则会记住它(存储在变量latest中)但不会打印。如果该行不以>开头,则会打印,但只有在首次打印latest中最近存储的内容后才会打印。

条件意味着每条打印的>行只会出现一次,即使一行中有多条非>行也是如此。由于您的样本数据不会发生这种情况,您可能不需要复杂化,并且可以使用这个更简单的无条件版本:

awk '/^>/ { latest=$0 } !/^>/ { print latest; print }'

答案 1 :(得分:2)

只需使用带有uniq-w)选项的--check-chars=N命令即可​​轻松实现所需的结果:

cat testfile | uniq -w 3

输出:

>1_SRR1422294
ATCGTCAGGTAGGGTTGCGCTCGTTGCGGGACTTAACCCAACATCTCACGACACGAGCTGACGACAGCCATGCAT
>2_SRR1422294
CGTCAGACGTAGGGTTGCGCTCGTTGCGGGACTTAACCCAACATCTCACGACACGAGCTGACGACAGCCATGCAG
>5_SRR1422298
CGTCAGACGTAGGGTTGCGCTCGTTGCGGGACTTAACCCAACATCTCACGACACGAGCTGACGACAGCCATGCAG
>6_SRR1422294
TGTTCATGGTAGGGTTGCGCTCGTTGCGGGACTTAACCCACATCTCACGACACGAGCTGACGACAGCCATGCAGC
>9_SRR1422294
GCGACTAGGTAGGGTTGCGCTCGTTGCGGGACTTAACCCACATCTCACGACACGAGCTGACGACAGCCATGCAGC
  

-w, - check-chars = N
  在行

中比较 N 字符不超过

http://man7.org/linux/man-pages/man1/uniq.1.html

它将比较每行的第一个 N 字符,以便为重复的行做出决定

答案 2 :(得分:2)

尝试:如果您的数据与给定的样本Input_file相同,那么下面的内容可能对您有帮助。

awk '/^>/{A=$0;next} {print A ORS $0;A=""}'  Input_file

答案 3 :(得分:0)

这可能适合你(GNU sed):

sed 'N;/^>.*\n>/!P;D' file

如果第一行和第二行以>开头,则在模式空间中读取两行并且不打印这些行中的第一行。

答案 4 :(得分:0)

sed 'N;/^>.*\n\w/!D' file #(GNU sed)

N:在模式空间中读取下一行。
/^>.*\n\w/!D:如果第一行以">"开头,则删除第一行;并且第二行不以字母

开头