Linux

根據來自另一列的指令更改列中的字元

  • January 2, 2018

我正在嘗試設置一個腳本,該腳本將根據我在 NGS 數據中找到的變體將密碼子序列轉換為另一個密碼子序列。

目前,我的腳本創建一個製表符分隔的輸出文件,有 6 列。每列代表以下內容:

  • 第一:基因組位置
  • 第二:核苷酸鹼基
  • 第三:密碼子
  • 第四:密碼子中的基因組位置順序
  • 5th:SNP頻率
  • 第六名:SNP基地

輸出數據如下所示:

2289     G       GTG    3        0.0346505      A

2478     G       ATG    2        0.0054087      C

是否可以在輸出文件中設置第 7 列,根據第 4 列中的數字將密碼子的核苷酸序列更改為 SNP 核苷酸(第 6 列)?

例如,

  • 對於基因組位置 2289:

密碼子 GTG 將變為 GTA。SNP 核苷酸 A 替換密碼子中的第 3 個核苷酸序列,密碼子序列順序在第 4 列中指定。

  • 對於基因組位置 2478

密碼子 ATG 將變為 ACG。SNP 核苷酸 C 取代了密碼子中的第二個核苷酸序列。

是否可以使用awksed執行此操作?

對“是否有可能……”這個問題只回答“是”是如此誘人。

這樣的事情會做嗎?

awk '{l=substr($3,1,$4-1); r=substr($3,$4+1); print $0"\t"l $6 r}' genome > mutated

處理字元串中允許的位置:

awk -F"\t" '{printf $0 "\t"; if ($4 > 1) { printf substr($3, 1, $4 - 1) }; printf $6; if ($4 < length($3)) { printf substr($3, $4 + 1) }; printf "\n"}'

或者也許更容易理解:

awk -F"\t" 'BEGIN { OFS = FS } { if ($4 > 1) { mod = substr($3, 1, $4 - 1) }; mod = mod $6; if ($4 < length($3)) { mod = mod substr($3, $4 + 1) }; print $0, mod }'

而且由於substr似乎不太關心邊界:

awk -F"\t" 'BEGIN { OFS = FS } { mod = substr($3, 1, $4 - 1) $6 substr($3, $4 + 1); print $0, mod }'

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