只有当它后面跟着以相同字符开头的行时,我如何才能删除该行?
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: 如果第一行以“>”开头且第二行不是字母开头,则删除第一行
我需要一些有关 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: 如果第一行以“>”开头且第二行不是字母开头,则删除第一行