使用 bash 从格式化文本中提取值

使用 bash 从格式化文本中提取值

我有一个 .fasta 文件,它是严格格式化的文本,包含一些有关 DNA 的信息。这是它的常见结构:

>NODE_18_length_75451_cov_83.3021
TGAACCGCTTGCCAAATATTTTCCGTCCGGACTTACGGCAACGGAAAGGAC
>NODE_3_length_175235_cov_84.0427
ACATGCAATGTTTATAGTCCTTGTATCAGAGACTCTATCAACGCTCTCGG

在偶数行上你有 DNA 序列,在奇数行上你有关于该序列的信息。该方案在单个文本文件中重复至少 10k 行。我需要找到一种方法来仅获取每行“cov_”之后的值,将其乘以 2 并打印到新文件中。新文件需要具有此方案(对于所有行):

>NODE_18 cov_166.60
DNA seq: TGAACCGCTTGCCAAATATTTTCCGTCCGGACTTACGGCAACGGAAAGGAC
>NODE_3 cov_168.04
DNA seq: ACATGCAATGTTTATAGTCCTTGTATCAGAGACTCTATCAACGCTCTCGG  

答案1

如果您确实想使用 shell 来执行此操作,您可以将算术交给另一个命令,例如bc

while read odd ; do
    echo -n "cov_" ; echo "2*${odd##*_}" | bc -q
    read even
    echo "DNA seq: $even"
done < input.fasta

答案2

用bash?不要去那里,它不是文本处理语言。使用 awk:

awk -F_ '/^>/ {printf "%s_%s cov_%.2f\n", $1, $2, $6 * 2; next} {print "DNA seq:", $0}' file.fasta 
>NODE_18 cov_166.60
DNA seq: TGAACCGCTTGCCAAATATTTTCCGTCCGGACTTACGGCAACGGAAAGGAC
>NODE_3 cov_168.09
DNA seq: ACATGCAATGTTTATAGTCCTTGTATCAGAGACTCTATCAACGCTCTCGG

相关内容