连接特定行并将结果输出到新文件中

连接特定行并将结果输出到新文件中

我有多个文本文件,例如:

文件1:

>ID_000_FLNNKGHD_01376 
-ATGAATACAGAGGAAAAAACACCGCTTGCATACAAT
>ID_000_MGCDKLCO_02388 
ATGAAGGTGGAAAAAACACCGCTTGCATTT
>ID_000_OMAMOGKP_02746
--ATGTTGGTGGAAAAAACACCGCTTGCGGTA

文件2:

>ID_000_KGHDAAD_06245 
AAATACAGAGGAAAAAACACCGCTTGCATACAAT
>ID_000_KOAAFG_40481 
CCCCAGGAAGGTGGAAAAAACACCGCTTGCAAA
>ID_000_GPAAAGVV_07764
--AAATTGGTGG---------ACACCGCTTTT--

ETC。

我需要连接每个文件的第一行和第二行、第三行和第四行等,并为每个结果输出一个新文件,如下所示:

文件1输出:

>ID_000_FLNNKGHD_01376-ID_000_KGHDAAD_06245 
-ATGAATACAGAGGAAAAAACACCGCTTGCATACAATAAATACAGAGGAAAAAACACCGCTTGCATACAAT

文件2输出:

>ID_000_MGCDKLCO_02388-ID_000_KOAAFG_40481
ATGAAGGTGGAAAAAACACCGCTTGCATTTCCCCAGGAAGGTGGAAAAAACACCGCTTGCAAA

文件3输出:

>ID_000_OMAMOGKP_02746-ID_000_GPAAAGVV_07764
--ATGTTGGTGGAAAAAACACCGCTTGCGGTA--AAATTGGTGG---------ACACCGCTTTT--

ETC。

*注意第一行需要以“>”开头,并在每个字符串之间添加“-”连接,第二行只是放在一起

输出需要命名为 file_1.fasta 到 file_n.fasta

谢谢!

答案1

这是一种方法:

paste file1.fa file2.fa | 
    sed -E 's/\s+>/-/; s/\s+//g' | 
        awk -v c=0 '{ if(/^>/){c++} print > "file"c".pasted.fa"; }'

为了解释这一点,让我们看一下每个命令的输出:

$ paste file1.fa file2.fa 
>ID_000_FLNNKGHD_01376  >ID_000_KGHDAAD_06245 
-ATGAATACAGAGGAAAAAACACCGCTTGCATACAAT   AAATACAGAGGAAAAAACACCGCTTGCATACAAT
>ID_000_MGCDKLCO_02388  >ID_000_KOAAFG_40481 
ATGAAGGTGGAAAAAACACCGCTTGCATTT  CCCCAGGAAGGTGGAAAAAACACCGCTTGCAAA
>ID_000_OMAMOGKP_02746  >ID_000_GPAAAGVV_07764
--ATGTTGGTGGAAAAAACACCGCTTGCGGTA    --AAATTGGTGG---------ACACCGCTTTT--

因此,这将打印每个文件中彼此相邻的每一行。文件 1 的第 1 行和文件 2 的第 1 行,文件 1 的第 2 行和文件 2 的第 2 行等等。但是,它有一些额外的空格和>我们需要删除的额外空格。这就是sed正在做的事情:

$ paste file1.fa file2.fa | sed -E 's/\s+>/-/; s/\s+//' 
>ID_000_FLNNKGHD_01376-ID_000_KGHDAAD_06245
-ATGAATACAGAGGAAAAAACACCGCTTGCATACAATAAATACAGAGGAAAAAACACCGCTTGCATACAAT
>ID_000_MGCDKLCO_02388-ID_000_KOAAFG_40481
ATGAAGGTGGAAAAAACACCGCTTGCATTTCCCCAGGAAGGTGGAAAAAACACCGCTTGCAAA
>ID_000_OMAMOGKP_02746-ID_000_GPAAAGVV_07764
--ATGTTGGTGGAAAAAACACCGCTTGCGGTA--AAATTGGTGG---------ACACCGCTTTT--

最后一步,awk脚本将:

  • awk -v c=0:启动awk并将变量设置c0
  • if(/^>/){c++}c:每次找到以 开头的行时,将 的值加 1 >
  • print > "file"c".pasted.fa":将当前行打印到名为 的文件中file,然后将 的当前值c.pasted.fa.

在您的示例上运行的最终结果是:

$ ls *pasted*
file1.pasted.fa  file2.pasted.fa  file3.pasted.fa

$ cat file1.pasted.fa 
>ID_000_FLNNKGHD_01376-ID_000_KGHDAAD_06245
-ATGAATACAGAGGAAAAAACACCGCTTGCATACAATAAATACAGAGGAAAAAACACCGCTTGCATACAAT
$ cat file2.pasted.fa 
>ID_000_MGCDKLCO_02388-ID_000_KOAAFG_40481
ATGAAGGTGGAAAAAACACCGCTTGCATTTCCCCAGGAAGGTGGAAAAAACACCGCTTGCAAA
$ cat file3.pasted.fa 
>ID_000_OMAMOGKP_02746-ID_000_GPAAAGVV_07764
--ATGTTGGTGGAAAAAACACCGCTTGCGGTA--AAATTGGTGG---------ACACCGCTTTT--

相关内容