我需要一些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
请注意,并非所有行都具有相同的数字,但它们都具有相同的格式,这就是我想使用正则表达式的原因。如果你能解释如何阅读你生产的代码真的很棒。
非常感谢你!
答案 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:如果第一行以">"开头,则删除第一行;并且第二行不以字母