![连接特定行并将结果输出到新文件中](https://linux22.com/image/158402/%E8%BF%9E%E6%8E%A5%E7%89%B9%E5%AE%9A%E8%A1%8C%E5%B9%B6%E5%B0%86%E7%BB%93%E6%9E%9C%E8%BE%93%E5%87%BA%E5%88%B0%E6%96%B0%E6%96%87%E4%BB%B6%E4%B8%AD.png)
我有多个文本文件,例如:
文件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
并将变量设置c
为0
。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--