Bash

用於搜尋 DNA 密碼子的正則表達式語法

  • March 12, 2020

我必須為分配編寫一個腳本,它將文件名作為命令並輸出文件中每個唯一的 3 個基本密碼子以及它按降序出現的次數。腳本必須檢查它是否有參數,如果沒有則輸出錯誤消息。我對如何開始和正則表達式的語法感到困惑,我需要讓腳本搜尋每個唯一密碼子。關鍵是一個文件只包含以隨機順序重複的“a”“c”“t”“g”字母,目的是編寫一個腳本,該腳本將從文件的開頭開始並顯示每個唯一的3 字母密碼子及其計數,例如 aac 或 acg。

例如,如果名為 dnafile 的文件包含模式 aacacgaactttaacacg,則腳本將採用以下輸入和輸出

$script dnafile              
aac 3
acg 2
ttt 1

如果錯誤檢查顯示錯誤,它應該是script cannot open file dnafile for reading

要從單個文件中獲取所有完整密碼子:

{
   for (pos = 1; pos < length - 1; ++pos) {
       codon = substr($0, pos, 3)
       print codon
   }
}

這個簡短的awk腳本只輸出每行的每三個字元長的子字元串。在生物資訊學中,它依次輸出每一幀的完整密碼子。

對給定數據進行測試:

$ awk -f script.awk <file
aac
aca
cac
acg
cga
gaa
aac
act
ctt
ttt
tta
taa
aac
aca
cac
acg

然後,您可以對每個密碼子出現的次數進行排序和計數:

$ awk -f script.awk <file | sort | uniq -c
  3 aac
  2 aca
  2 acg
  1 act
  2 cac
  1 cga
  1 ctt
  1 gaa
  1 taa
  1 tta
  1 ttt

如果文件包含換行符,則首先刪除這些以獲取被換行符破壞的密碼子:

$ cat file
aacacgaactttaacacg
aacacgaactttaacacg
$ tr -d '\n' <file | awk -f script.awk | sort | uniq -c
  6 aac
  4 aca
  4 acg
  2 act
  4 cac
  3 cga
  2 ctt
  3 gaa
  2 taa
  2 tta
  2 ttt

(請注意計數如何更改為 3 而不是 2 cgagaa

如果您的數據很大,那麼您將不得不想出其他方法來處理換行符之間的轉換:

{
   $0 = lastbit $0

   for (pos = 1; pos < length - 1; ++pos) {
       codon = substr($0, pos, 3)
       print codon
   }

   lastbit = substr($0, length - 1)
}

這將保存每行的最後兩個鹼基lastbit並將它們添加到序列的下一行。

在與上面相同的兩行輸入上執行它:

$ awk -f script.awk <file | sort | uniq -c
  6 aac
  4 aca
  4 acg
  2 act
  4 cac
  3 cga
  2 ctt
  3 gaa
  2 taa
  2 tta
  2 ttt

如果您只想要第一幀中的密碼子:

{
   $0 = lastbit $0

   for (pos = 1; pos < length - 1; ++pos) {
       if ((pos + length(lastbit)) % 3 == 1) {
           codon = substr($0, pos, 3)
           print codon
       }
   }

   lastbit = substr($0, length - 1)
}

sort -nr如果您希望輸出按計數按降序排序,請在上面的管道中添加一個額外的步驟。

也可以看看:

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