所以我有一个看起来像这样的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个字符,同时在输出中保持其余各行的完整性。我该怎么办?
在GNU sed中,您可以使用~
地址,它指定每第n行:
sed '2~2 s/\(.*\).\{20\}/\1/' file
命令表示
2~2
从第2行开始,每2行应用一次s/PATTERN/REPLACE/
是替代项.\{20\}
匹配20个字符\(.*\)
会记住20个字符之前的任何字符]\1
是第一个被记住的组[使用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
用自己的子字符串替换每条选定的行。
我会和前者一样简洁明了;但是后者的显式性也有一定的优点,因为它具有很大的自我记录能力。