只有当它后面跟着以相同字符开头的行时,我如何才能删除该行?

How can i remove a line only if it is followed by a line that starts with the same character?

我需要一些有关 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

请注意,并非所有行都具有相同的数字,但它们都具有相同的格式,这就是我要使用正则表达式的原因。如果您能解释如何阅读您生成的代码,那就太好了。

非常感谢!

如果整个文件都遵循该模式(一些行以 > 开头,您只需要最后一行,后面跟着一行应该始终打印的行),您可以使用类似这个:

awk '/^>/ { latest=[=10=] } !/^>/ { if (latest) { print latest; latest="" } print }'

如果该行以 > 开头,那么它会被记住(存储在变量 latest 中)但不会打印出来。如果该行不是以 > 开头,那么它会被打印,但只有在第一次打印最近存储在 latest 中的内容之后才会打印。

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

awk '/^>/ { latest=[=11=] } !/^>/ { print latest; print }'

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

cat testfile | uniq -w 3

输出:

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

-w, --check-chars=N
          compare no more than N characters in lines

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


它会比较每行的前 N 个字符来决定重复行

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

awk '/^>/{A=[=10=];next} {print A ORS [=10=];A=""}'  Input_file

这可能适合您 (GNU sed):

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

将两行读入模式 space,如果第一行和第二行以 > 开头,则不打印第一行。

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

N:将下一行读入模式 space。
/^>.*\n\w/!D: 如果第一行以“>”开头且第二行不是字母开头,则删除第一行