linux - 跳过标题将文件中的多行合并为单行

标签 linux awk sed

我在一个文件夹中有几千个文件。每个文件的内容如下所示。我在这个例子中的文件名是: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

cat -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// 移除换行符
    • 如果 $. > 1 && !eof 仅当行号大于 1 且不是文件结尾时
  • 使用 perl -i -pe 进行就地编辑。参见 Command Switches -i-p-e
  • 的文档

关于linux - 跳过标题将文件中的多行合并为单行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43653940/

相关文章:

linux - 删除字符串中的所有单字符单词 EXCEPT 'a' 'i' 和 'o'

bash - 如何通过awk命令计算csv文件中的 "|"?

linux - 给定行范围时如何使用 sed 命令从文本文件中提取内容?

linux grep/sed 某些行 - 空间删除

php - Ubuntu imageMagick 不会将 PDF 从 www-data (php) 转换为 PNG

php - 如何使用带有 exec 的 avconv 和 php 显示流的屏幕截图?

perl - 什么脚本可以帮助解析一组错误换行的行?

c++ - 如何在 Linux 中找到具有写时复制的 fork 进程之间共享多少内存?

java - Maven 构建失败并出现错误 : Could not find artifact . .. 在指定的路径 - 路径稍微不正确

awk - 将日期时间附加到 6 亿行文件中的每一行的末尾