在单个文件中根据模式创建单独的文件

在单个文件中根据模式创建单独的文件

我有一个包含 2.3M 行的文件。如下所示:

$less V2.fastq

>TS19_EWP4IQK02JPFP5
CATGCTGCCTCCCGTAGGAGTTTGGTCCGTGTCTCAGTACCAATGTGGGGGACCTTCCTC
TCAGAACCCTATCCATCGTCGGTTTGGTGGGCCGTTACCCGCCAACTGCCTAATGGAACG
CATGCCTATCTATCAGCGATGAATCTTTAGCAAATATCCCCATGCGGGGCCCTGCTTCAT
GCGGTATTAGTCCGACTTTCGCCGGGTTATCCCCTCTGATAGGTAAGTTGCATACGCGTT
ACTCACCGTGCGCCGG
>TS20_EWP4IQK02FSQQL
CATGCTGCCTCCCGTAGGAGTTTGGACCGGTGTCTCAGTTCCAACTGTGGGGGGACCTTC
CTCTCCAGAACCCCCTATCCCATCGAAG
>TS19_EWP4IQK02GBB8K
CATGCTGCCTCCCGTAGGAGTCTGGGCCGTGTCTCAGTCCCAGTGTGGCCGATCACCCTC
TCAGGTCGGCTATGTATCGTCGCCTAGGTGAGCCGTTACCTCACCTACTAGCTAATACAA
CGCAGGTCCATCTTGTAGTGGAGCATTTGCCCCTTTCAAATAAATGACATGAGTCACCCA
TTGTTATGCGGTATTAGCTATCGTTTCCAATAGTTATCCCCCGCTACAAGGCAGGTTACC
TACGCG
>TS19_EWP4IQK02FUJRM
CATGCTGCCTCCCGTAGGAGTTTGGACCGTGTCTCAGTTCCAATGTGGGGGACCTTCCTC
TCAGAACCCCTATCCATCGAAGACTAGGTGGGCCGTTACCCCGCCTACTATCTAATGGAA
CGCACCCCCATCTTACACCGGTAAACCTTTAATCATGCGAAAATGCTTACTCATGATAAC
ATCTTGTATTAATCTCCCTTTCAGAAGGCTGTCCAAGAGTGTAAGGCAGGTTGGATACGC
GTTACTCACCCGTGCGCCGGTCG
>TS119_EWP4IQK02I2KHZ
CATGCTGCCTCCCGTAGGAGTTTGGACCGTGTCTCAGTTCCAATGTGGGGGACCTTCCTC
TCAGAACCCCTATCCATCGATGGCTTGGTGGGCCGTTACCCCGCCAACAACCTAATGGAA
CGCATCCCCATCAATGACCGAAATTCTTTAATAGCTGAAAGATGCCTTTCAGATATACCA
TCGGGTATTAATCTTTCTTTCGAAAGGCTATCCCCGAGTCATCGGCAGGTTGGATACGTG
TTACTCACCCGTGCGCCGTCG

以“>”开头的行表示单个 SampleID。样本名称由该行中“_”之前的术语指定。例如:TS19、TS20、TS119 等我想为每个包含 SampleID 和其中内容的样本创建单独的输出文件。有人能帮我吗?

非常感谢

编辑:1 为了获取样本的输出,TS_19我们可以使用此命令,它返回以下输出: 命令

sed -n '/>TS19_/, />/p' V2.fasta 

输出(数千行中的几行)

>TS19_ok4.40713 CTAACGCAGTCA
TTGGGCCGTGTCTCAGTCCCAATGTGGCCGGTCACCCTCTCAGGTCGGCTACTGATCGTCGGCTTGGTAGGCCGTTACCCCACCAACTACCTAATCAGACGCGGGTCCATCTCATACCACCGGAGCTTTTTCACACCGTACCATGCGGTACTGTGCGCTTATGCGGTATTAGCAGTCGTTTCCAACTGTTATCCCCTGTATGAGGCAGGTTACCCACGCGTTACTCACCCGTCCG
>TS6.2_ok4.40714 CGTCAGACGGAT
>TS19_ok4.40771 CTAACGCAGTCA
TTGGGCCGTGTCTCAGTCCCAATGTGGCCGGTCACCCTCTCAGGTCGGCTACTGATCGTCGCTTTGGTAGGCCGATACCCCACCAACCGGCTAATCAGACGCGGGTCCATCTCATACCACCGGAGTTTTTACCCCTCGCACCATGCGGTGCTGTGGTCTTATGCGGTATTAGCAGTCATTTCTTGACTGTTTATTTCCCCTCGTATGAGGCAGGTTACCCACGCGTTACTCACCCG
>TS8_ok4.40772 TCGAGACGCTTA
>TS19_ok4.40971 CTAACGCAGTCA
CTGGGCCGTGTCTCAGTCCCAATGTGGCCGGTCACCCTCTCAGGTCGGCTACTGATCATCGCCTTGGTGGGCCGTTACCCCGCCAACAAGCTAATCAGACGCGGGTCCATCTCATACCACCGGAGTTTTTCACACTGTACCATGTGGTACTGTGCGCTTATGCGGTATTACCAGCCGTTTCCAGCTGCTATCCCCATCTGAAGGGCAGGTTGCTTACGCGG
>TS127_ok4.40972 GACCGAGCTATG

我只想删除以 开头>但不跟 的行TS_19。有人能帮助我吗?

编辑:2 https://drive.google.com/file/d/17MC0tiIE6axOJqNZukzsQX5bVpuvV312/view?usp=sharing

答案1

使用awk,您可以设置>为记录分隔符并处理(匹配)整个记录而不是行,并搜索例如包含“TS19”的记录,如下所示:

awk 'BEGIN {RS=">"; ORS=RS} /TS19/' V2.fasta

.split或者自动将每种记录类型拆分为扩展名为 ie的文件,TS119.split TS19.split TS20.split ...放在同一个工作目录中,如下所示:

awk 'BEGIN {RS=">"; ORS=RS} {split($1, arr, "_"); f=arr[1]".split"; print > f}' V2.fasta

答案2

不久前,我专门为此编写了一个 perl 脚本。

该脚本获取 fasta 文件并为所有序列创建单独的文件。它还将清理 fasta 文件:默认情况下,序列中的换行符以及标题 (> id) 中的空行和前导空格都会被删除。此外,非 ACGT 字符可以转换为 N,小写序列字符可以转换为大写。

该脚本名为split_fasta.plhttps://github.com/nterhoeven/sequence_processing

答案3

编辑1去掉-n 7......你将不再需要它。

csplit -z v2.fastq  -f TestSample /\>TS/ '{*}'

将根据您的文件生成文件 TestSample00、TestSample01、TestSample02、TestSample03……TestSamplennnnnn。

最后,您需要一个前缀来标识所有这些文件。抱歉,我的解决方案不会重命名您的文件以显示测试样本编号命名约定,但至少您可以在每次运行命令时通过使用以下方式更改前缀来更改它:-F范围。

编辑2
但是,如果您需要将具有相同测试样本标识符的所有数据收集到同一个文件中,则可以使用以下命令

find . -name "TestSample*" | xargs grep -l TS19_ | awk '{print "cat " $1"  >> My_TS19_.fasta " }' | sh

新文件 (My_TS19_.fasta) 将包含与 TS19_ 相关的所有序列,或您在其后输入的任何区分大小写的字符串grep

我添加了 xargs 命令来流式传输文件列表,而不是抑制 find 命令。

awk 命令获取文件名并将每个文件名附加到最初不存在或为空的文件中。每次都要小心使用新文件,以避免重复。

相关内容