Text-Processing

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

  • February 13, 2018

我有一個 .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  

如果您真的想為此使用 shell,您可以將算術交給另一個命令,例如bc

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

用 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

引用自:https://unix.stackexchange.com/questions/423766