如何使用awk提取多个sta文件中的最后一个contig



我正在尝试提取多个sta文件的第一个和最后一个contig。它们都有不同的名称,所以我不想用特定的名称,而是用文件中的位置。

我使用这个awk命令awk '/^>/{if(N)exit;++N;} {print;}' in.fasta来获取第一个contig,但我不确定如何获取文件中的最后一个contig。

我的fasta文件看起来像这样(但有更多的contig(:

PA257_2805 MKFSEKWLRSWANPQVSHDELVARLSVGLEVDADLPVAGFSGVGEVLSTEQPDAD>第257_2806页

,我想取出文件中的第一个和最后一个contig,这样它们就在两个单独的fasta文件中(就像它们在原始文件中一样(。

所需输出-一个文件中有第一个contig:

`>PA257_2805 MKFSEKWLRSWANPQVSHDELVARLSMVGLEVDADLPVAGAFSGVVVGEVLSTEQHPDAD

和中最后一个重叠群的第二个

`>第257_2806页

(注意,在实际文件中有两个以上的重叠群,并且都有不同的名称(

如果有人能帮助我,我将不胜感激!

如何获取文件中的最后一个contig

我会按照以下方式利用GNUAWK来完成这项任务,让file.txt的内容是

PA257_2805
MKFSEKWLRSWANPQVSHDELVARLSMVGLEVDADLPVAGAFSGVVVGEVLSTEQHPDAD
>PA257_2806
MGALTKAEIAERLYEELGLNKREAKELVELFFEEIRQALEHNEQVKLSGFGNFDLRDKRQ RPGRNPKTGEEIPITARRVVTFRPGQKLKARVEAYAGTKS

然后

awk 'BEGIN{RS=">"}END{printf "%s",">" $0}' file.txt

给出输出

>PA257_2806
MGALTKAEIAERLYEELGLNKREAKELVELFFEEIRQALEHNEQVKLSGFGNFDLRDKRQ RPGRNPKTGEEIPITARRVVTFRPGQKLKARVEAYAGTKS

说明:我假设>字符只出现在标题的开头,我通知GNUAWK>是行分隔符(RS(。在处理完所有行之后,我访问$0,它按原样表示最后一行,我用>作为前缀,并使用printf,以避免附加多余的换行符(这是默认的输出行分隔符(。如果你想了解更多关于RS的信息,请阅读8个强大的Awk内置变量——FS、OFS、RS、ORS、NR、NF、FILENAME、FNR

(在gawk 4.2.1中测试(

一个没有awk的解决方案:不是最高效的,但易于遵循和修改。单独处理fasta ID比ID+附加序列更容易。

制作一个仅包含fasta ID的文件。使用sed查找>字符并将其替换为零。将第一个ID写入文件。将最后一个ID附加到同一个文件。然后使用seqtk基于ID恢复完整序列。Seqtk需要没有>的纯ID名称,这就是我们之前删除它们的原因。您可能需要为此安装seqtk,但如果您使用的是fasta文件,您可能无论如何都想这样做。

grep ">" in.fasta | sed 's/>//' file > fasta_names
cat fasta_names | head -1 > names.lst
cat fasta_names | tail -1 >> names.lst
seqtk subseq in.fasta names.lst > out.fq

最新更新