如何在特定行的末尾剪切20个字符,同时在bash中保持输出中的所有其他行不变[关闭]

问题描述 投票:1回答:2

所以我有一个看起来像这样的FASTA文件,我分成了2行文件

\>H.Sapiens.1M.Illumina.low.000000000/1
CTCCTTGCCTCATCCTCCCAAATAGCATGCACCACCACGCGCAGCTAATTT
\>H.Sapiens.1M.Illumina.low.000000000/2
AGGCTGAGATAAGAATATAATAGGACAAAAAACAAGATTTTCAGTTTCAAA
\>H.Sapiens.1M.Illumina.low.000000001/1
AGATAGCCCTTCAAAGGAGTTTCATCATCTTTACGGGAGGTTATCTAACAA
\>H.Sapiens.1M.Illumina.low.000000001/2
TTAAGATTTCGAGGAGTCAAAAGGTGTATGTGGACTTTCAACTGCAGGGGG

还有一个我分成四行的FASTQ文件

@H.Sapiens.1M.Illumina.l100.low.000000000/1
CTCCTTGCCTCATCCTCCCAAATAGCATGCACCACCACGCGCAGCTAATTT
+
KGOLHSAHTEFKMLGJPENFEGMIDAHKMIJFIEIHKCFCGHEGMJGHHPH
@H.Sapiens.1M.Illumina.l100.low.000000000/2
AGGCTGAGATAAGAATATAATAGGACAAAAAACAAGATTTTCAGTTTCAAA
+
IHHHIIIIHHIHHIHIIHHGFKGGIHGJGEIIFEEGIBHJKKJJIJJEJJF

并且我需要一个bash脚本,对于FASTA,该脚本可以在第二行的末尾剪切20个字符,对于FASTQ,可以在第二行和第四行的末尾剪切20个字符,同时在输出中保持其余各行的完整性。我该怎么办?

bash bioinformatics fasta fastq
2个回答
2
投票

在GNU sed中,您可以使用~地址,它指定每第n行:

sed '2~2 s/\(.*\).\{20\}/\1/' file

命令表示

  • [2~2从第2行开始,每2行应用一次
  • s/PATTERN/REPLACE/是替代项
  • [.\{20\}匹配20个字符
  • [\(.*\)会记住20个字符之前的任何字符]
  • [\1是第一个被记住的组

0
投票

[使用Awk,很容易说“在与正则表达式/^>/不匹配的行上执行此操作”(对于FASTA)或“在与/^@/匹配的行后的第1行和第3行”(对于FASTQ)。截断最后20个字符的操作可以用不同的方式表示,因此让我展示两个不同的选择。

awk '!/^>/ { sub (/.{20}$/, ""); } 1' file.fasta

使用正则表达式替换;或

awk '/^@/ { n=NR }
    NR==n+1 || NR==n+3 { $0 = substr($0, 1, length($0)-20) } 1' file.fastq

用自己的子字符串替换每条选定的行。

我会和前者一样简洁明了;但是后者的显式性也有一定的优点,因为它具有很大的自我记录能力。

在线演示:https://ideone.com/la3DDT

© www.soinside.com 2019 - 2024. All rights reserved.