将文件中的多行合并到单行文件中跳过标题
我在文件夹中有几千个文件。每个文件的内容如下所示。我在这个例子中的文件名是:AAB08704.1.fasta将文件中的多行合并到单行文件中跳过标题
>gi|1117824|gb|AAB08704.1| ecdysteroid regulated 16 kDa [Manduca sexta]
MLFYITVTVLLVSAQAKFYTDCGSKLATVQSVGVSGWPENARECVLKRNSNVTISIDFSPTTDVSAITTE
VHGVIMSLPVPFPCRSPDACKDNGLTCPIKAGVVANYKTTLPVLKSYPKVSVDVKWELKKDEEDLVCILI
PARIH
我想跳过第一行,然后将余下线合并成一条线。我所有的文件都以“>”开头,这是标题信息,以下几行是我想合并成一行的序列信息。
我试图
sed -i '2,$s/\n//g' AAB08704.1.fasta
我甚至尝试多FASTA转换为单行FASTA使用:
awk '/^>/ {printf("\n%s\n",$0);next; } { printf("%s",$0);} END {printf("\n");}' < AAB08704.1.fasta
这两个命令没有做什么,我的期望。任何线索?
预期输出:
>gi|1117824|gb|AAB08704.1| ecdysteroid regulated 16 kDa [Manduca sexta]
MLFYITVTVLLVSAQAKFYTDCGSKLATVQSVGVSGWPENARECVLKRNSNVTISIDFSPTTDVSAITTEVHGVIMSLPVPCRSPDACKDNGLTCPIKAGVVANYKTTLPVLKSYPKVSVDVKWELKKDEEDLVCILIPARIH
猫-A AAB08704.1.fasta给出了这样的:
M-oM-;M-?>gi|1117824|gb|AAB08704.1| ecdysteroid regulated 16 kDa [Manduca sexta]^M$
MLFYITVTVLLVSAQAKFYTDCGSKLATVQSVGVSGWPENARECVLKRNSNVTISIDFSPTTDVSAITTE^M$
VHGVIMSLPVPFPCRSPDACKDNGLTCPIKAGVVANYKTTLPVLKSYPKVSVDVKWELKKDEEDLVCILI^M$
随着perl
$ perl -pe 's/\n// if $. > 1 && !eof' AAB08704.1.fasta
>gi|1117824|gb|AAB08704.1| ecdysteroid regulated 16 kDa [Manduca sexta]
MLFYITVTVLLVSAQAKFYTDCGSKLATVQSVGVSGWPENARECVLKRNSNVTISIDFSPTTDVSAITTEVHGVIMSLPVPFPCRSPDACKDNGLTCPIKAGVVANYKTTLPVLKSYPKVSVDVKWELKKDEEDLVCILIPARIH
-
s/\n//
删除换行符-
if $. > 1 && !eof
只有当行号文件
-
- 使用
perl -i -pe
大于一个,而不是结束对就地编辑。见Command Switches的文档上-i
,-p
和-e
喜欢这个?用于GNU AWK:
$ awk '{p=p $0 (FNR==1?ORS:"")}ENDFILE{print p;p=""}' file file
>gi|1117824|gb|AAB08704.1| ecdysteroid regulated 16 kDa [Manduca sexta]
MLFYITVTVLLVSAQAKFYTDCGSKLATVQSVGVSGWPENARECVLKRNSNVTISIDFSPTTDVSAITTEVHGVIMSLPVPFPCRSPDACKDNGLTCPIKAGVVANYKTTLPVLKSYPKVSVDVKWELKKDEEDLVCILIPARIH
>gi|1117824|gb|AAB08704.1| ecdysteroid regulated 16 kDa [Manduca sexta]
MLFYITVTVLLVSAQAKFYTDCGSKLATVQSVGVSGWPENARECVLKRNSNVTISIDFSPTTDVSAITTEVHGVIMSLPVPFPCRSPDACKDNGLTCPIKAGVVANYKTTLPVLKSYPKVSVDVKWELKKDEEDLVCILIPARIH
这一个>
之前移除所述第一记录中的所有字符:
$ awk 'FNR==1{sub(/^[^>]*/,"");p=$0 ORS;next}{p=p $0}ENDFILE{print p;p=""}' file file
>gi|1117824|gb|AAB08704.1| ecdysteroid regulated 16 kDa [Manduca sexta]
MLFYITVTVLLVSAQAKFYTDCGSKLATVQSVGVSGWPENARECVLKRNSNVTISIDFSPTTDVSAITTEVHGVIMSLPVPFPCRSPDACKDNGLTCPIKAGVVANYKTTLPVLKSYPKVSVDVKWELKKDEEDLVCILIPARIH
>gi|1117824|gb|AAB08704.1| ecdysteroid regulated 16 kDa [Manduca sexta]
MLFYITVTVLLVSAQAKFYTDCGSKLATVQSVGVSGWPENARECVLKRNSNVTISIDFSPTTDVSAITTEVHGVIMSLPVPFPCRSPDACKDNGLTCPIKAGVVANYKTTLPVLKSYPKVSVDVKWELKKDEEDLVCILIPARIH
我现在更新了我的预期输出 – biobudhan
没有错别字,只用一个模拟多个文件。 –
@Sundeep它有意地打印两次'file',因为在awk代码之后两次提到'file'。OP开始于:_I有数千个文件_,我认为@biobudhan不想在当时处理一个文件,因此我的解决方案会处理所有作为参数给出的文件。但是,输出没有要求(每个输出分开文件等),因此它将所有内容输出到stdout。如果你测试其他解决方案的问题,他们很可能会失败,如果给予更多的文件一次处理,所以他们需要在一个shell循环内运行。 –
sed的是面向行的,所以需要在缓冲液中加载线比除去\n
sed -i -e '1d' -e 'H;${x;s/\n//g}' AAB08704.1.fasta
awk可能适应行为
awk 'BEGIN{FS="\n";RS="()";OFS=""}{$1="";$0=$0 ""}' AAB08704.1.fasta > tmp && mv tmp AAB08704.1.fasta
# or
awk '!a++{next}{printf("%s", $0) > (FILENAME ".tmp")}' AAB08704.1.fasta && mv AAB08704.1.fasta.tmp AAB08704.1.fasta
# or
awk 'NR>1{printf("%s",$0)}' AAB08704.1.fasta > tmp && mv tmp AAB08704.1.fasta
我现在更新了我的预期输出 – biobudhan
awk方法只是删除我的文件的内容。 – biobudhan
对不起awk,我只是混合使用2版本的代码(RS在第二版中使用)。改编 – NeronLeVelu
这也适用于:
awk 'BEGIN{ ORS = "" }/^>/{ print $0, "\n"}NR>1{ print $0 }' file
输出:
>gi|1117824|gb|AAB08704.1| ecdysteroid regulated 16 kDa [Manduca sexta]
MLFYITVTVLLVSAQAKFYTDCGSKLATVQSVGVSGWPENARECVLKRNSNVTISIDFSPTTDVSAITTEVHGVIMSLPVPFPCRSPDACKDNGLTCPIKAGVVANYKTTLPVLKSYPKVSVDVKWELKKDEEDLVCILIPARIH
现在又增加了我的预期输出。 – biobudhan