0

我需要一些关于 sed 或 awks 的帮助。

仅当一行后跟以相同字符开头的行(在本例中为>)时,我如何才能删除该行?

示例我有这个:

>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

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

太感谢了!

4

5 回答 5

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​​个字符来决定是否重复行

于 2017-03-12T19:52:02.887 回答
2

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

awk '/^>/{A=$0;next} {print A ORS $0;A=""}'  Input_file
于 2017-03-12T19:55:02.953 回答
2

如果整个文件遵循该模式(一些以 开头的行>,您只需要最后一行,然后是应该始终打印的单行),您可以使用如下内容:

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

如果该行以 开头>,那么它会被记住(存储在变量中latest)但不会被打印。如果该行不以 开头>,则打印它,但仅在第一次打印最近存储在latest.

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

awk '/^>/ { latest=$0 } !/^>/ { print latest; print }'
于 2017-03-12T19:36:09.070 回答
0
sed 'N;/^>.*\n\w/!D' file #(GNU sed)

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

于 2017-03-13T03:39:08.870 回答
0

这可能对您有用(GNU sed):

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

将两行读入模式空间,如果第一行和第二行以 开头,则不要打印其中的第一行>

于 2017-03-12T22:00:24.610 回答