用不同文件中的索引替换 FASTA 文件中的数值。 (首选 Bash)

问题描述 投票:0回答:3

我有一个文件夹,里面装满了具有以下格式(等等)的fasta文件,其中以>开头的行是DNA序列的读取名称,下一行是序列本身。整个文件重复此模式:

> 887_ENCFF899MTI.fastq.gz_seq1
GGCCCGCCTCCCGTCGGCCGGTGCGAGCGGCTCCGCGA
> 55_ENCFF899MTI.fastq.gz_seq2
GGGGGGGGCGTCTCGCGCAAACGTCCATAAC
> ...
...

在读取名称中,[887] 对应于我用来查找此读取的查询序列的索引,存储在不同的文件中(例如 SequenceNames.txt)。可以假定另一个文件具有以下格式:

SequenceA
SequenceB
...

我只想将 > 和 _ 之间的数字(避免与文件名的偶然匹配)替换为与 SequenceNames 文件中该数字的索引匹配的序列。例如,我想要

> 1_ENCFF899MTI.fastq.gz_seq1
ACTATC
> 2_ENCFF899MTI.fastq.gz_seq1

成为

> SequenceA_ENCFF899MTI.fastq.gz_seq1
> SequenceB_ENCFF899MTI.fastq.gz_seq1

我通常能够进行这些替换,但我真的不确定如何将索引替换专门指向 > 和 _ 之间的位置/正则表达式匹配,而不对这些数字执行文件范围的字典替换,我是努力使用 awk 数组索引来获得类似的东西

gawk '{print gensub(/^> ([0-9]*)_/,array[pattern],"\\1")}'

生产我正在寻找的东西。

bash awk sed fasta character-replacement
3个回答
1
投票

假设希望将fasta文件中以

> 887_
开头的一行数字替换为
SequenceNames.txt
第887行的内容,则:

awk '
    # create lookup table
    NR==FNR { i2p[FNR] = $0; next }

    # try to change relevant lines
    $1==">" {

        # extract index
        idx = $2
        sub( /_.+/, "", idx )

        # try to replace (no change if no match)
        if (idx in i2p)
            sub( /^[^_]+/, "> "i2p[idx] )
    }

    # print all lines
    1
' SequenceNames.txt input.fasta >output.fasta

0
投票

使用 gawk:

awk 'NR==FNR{ar["> "NR"_"]=$0} 
NR>FNR{match($0,/^> [0-9]+_/,m); gsub(/^> [0-9]+_/, "> " ar[m[0]]"_", $0);print} ' SequenceNames.txt matches.fasta

NR==FNR
块从数组中的序列名称文件中收集行数据,该数组使用由“>”构建的字符串、行号和尾随的“_”字符进行索引。

NR>FNR
块存储与正则表达式匹配的字符串,该正则表达式要求行开始“>”后跟一个空格、一个数字和数组
m
中的下划线。然后使用 Gsub 将匹配项替换为序列名称数组中保存的相应值。

使用 GNU Awk 5.1.0 测试


0
投票

在 GNU

awk
中使用您显示的示例,请尝试遵循
awk
代码。

awk '
FNR==NR{
  seqVal[FNR]=$0
  next
}
/^>/ && match($0,/(^> )[^_]*(_.*$)/,arr){
  print arr[1] seqVal[++count] arr[2]
}
' sequencenames.txt input.fasta
© www.soinside.com 2019 - 2024. All rights reserved.