我正在尝试提取多个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