Regex 如果一行后面有一个以相同字符开头的行,如何删除该行?
我需要一些关于sed或awks的帮助 如果一行后面有一个以相同字符开头的行(在本例中为>),如何删除该行 我举了一个例子:Regex 如果一行后面有一个以相同字符开头的行,如何删除该行?,regex,awk,sed,fasta,reformat,Regex,Awk,Sed,Fasta,Reformat,我需要一些关于sed或awks的帮助 如果一行后面有一个以相同字符开头的行(在本例中为>),如何删除该行 我举了一个例子: >1_SRR1422294 ATCGTCAGGTAGGGTTGCGCTCGTTGCGGGACTTAACCCAACATCTCACGACACGAGCTGACGACAGCCATGCAT >2_SRR1422294 CGTCAGACGTAGGGTTGCGCTCGTTGCGGGACTTAACCCAACATCTCACGACACGAGCTGACGACAGCCATGCAG &g
>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=$0 } !/^>/ { if (latest) { print latest; latest="" } print }'
如果行以
开头,则会记住它(存储在变量latest
中),但不会打印。如果行不是以
开头,则只在第一次打印最近存储在latest
中的内容后才打印
条件表示即使一行中有多个非
行,每个打印的
行也只显示一次。由于这不会发生在示例数据中,因此您可能不需要复杂化,可以使用以下更简单的无条件版本:
awk '/^>/ { latest=$0 } !/^>/ { print latest; print }'
如果整个文件遵循该模式(以
开头的一些行,其中您只需要最后一行,后面是应始终打印的一行),则可以使用如下方式:
awk '/^>/ { latest=$0 } !/^>/ { if (latest) { print latest; latest="" } print }'
如果行以
开头,则会记住它(存储在变量latest
中),但不会打印。如果行不是以
开头,则只在第一次打印最近存储在latest
中的内容后才打印
条件表示即使一行中有多个非
行,每个打印的
行也只显示一次。由于这不会发生在示例数据中,因此您可能不需要复杂化,可以使用以下更简单的无条件版本:
awk '/^>/ { latest=$0 } !/^>/ { print latest; print }'
只需使用带有
-w
(-check chars=N
)选项的uniq
命令,即可轻松获得所需的结果:
输出:
>1_SRR1422294
ATCGTCAGGTAGGGTTGCGCTCGTTGCGGGACTTAACCCAACATCTCACGACACGAGCTGACGACAGCCATGCAT
>2_SRR1422294
CGTCAGACGTAGGGTTGCGCTCGTTGCGGGACTTAACCCAACATCTCACGACACGAGCTGACGACAGCCATGCAG
>5_SRR1422298
CGTCAGACGTAGGGTTGCGCTCGTTGCGGGACTTAACCCAACATCTCACGACACGAGCTGACGACAGCCATGCAG
>6_SRR1422294
TGTTCATGGTAGGGTTGCGCTCGTTGCGGGACTTAACCCACATCTCACGACACGAGCTGACGACAGCCATGCAGC
>9_SRR1422294
GCGACTAGGTAGGGTTGCGCTCGTTGCGGGACTTAACCCACATCTCACGACACGAGCTGACGACAGCCATGCAGC
-w,--check chars=N
比较行中不超过N个字符
它将比较每行的前N个字符,以决定重复的行只需使用
uniq
命令和-w
(--check chars=N
)选项即可轻松获得所需的结果:
输出:
>1_SRR1422294
ATCGTCAGGTAGGGTTGCGCTCGTTGCGGGACTTAACCCAACATCTCACGACACGAGCTGACGACAGCCATGCAT
>2_SRR1422294
CGTCAGACGTAGGGTTGCGCTCGTTGCGGGACTTAACCCAACATCTCACGACACGAGCTGACGACAGCCATGCAG
>5_SRR1422298
CGTCAGACGTAGGGTTGCGCTCGTTGCGGGACTTAACCCAACATCTCACGACACGAGCTGACGACAGCCATGCAG
>6_SRR1422294
TGTTCATGGTAGGGTTGCGCTCGTTGCGGGACTTAACCCACATCTCACGACACGAGCTGACGACAGCCATGCAGC
>9_SRR1422294
GCGACTAGGTAGGGTTGCGCTCGTTGCGGGACTTAACCCACATCTCACGACACGAGCTGACGACAGCCATGCAGC
-w,--check chars=N
比较行中不超过N个字符
它将比较每行的前N个字符,以决定重复的行尝试:如果您的数据与给定的示例输入文件相同,则以下内容可能会在相同方面帮助您
awk '/^>/{A=$0;next} {print A ORS $0;A=""}' Input_file
尝试:如果您的数据与给定的示例输入文件相同,那么以下内容可能会在相同方面帮助您
awk '/^>/{A=$0;next} {print A ORS $0;A=""}' Input_file
这可能适用于您(GNU-sed):
将两行读入图案空间,如果第一行和第二行以
开头,则不要打印其中的第一行 这可能适合您(GNU-sed):
sed 'N;/^>.*\n\w/!D' file #(GNU sed)
将两行读入图案空间,如果第一行和第二行以
开头,则不要打印其中的第一行
sed 'N;/^>.*\n\w/!D' file #(GNU sed)
N:将下一行读入模式空间/^>*\n\w/!D:如果第一行以“>”开头,第二行不以字母开头,则删除第一行
N:将下一行读入模式空间
/^>*\n\w/!D:如果第一行以“>”开头,而第二行不是以字母开头的GNU grep:
grep-Poz'^>*\n[^>].*文件
GNU grep:grep-Poz'^>*\n[^>].*文件