我正在尝试设置一个脚本,根据我在 NGS 数据中找到的变体,将一个密码子序列转换为另一个密码子序列。
目前,我的脚本创建一个制表符分隔的输出文件,有 6 列。每列代表以下内容:
- 第一:基因组位置
- 第二:核苷酸碱基
- 第三名:密码子
- 第四:密码子中的基因组位置顺序
- 第五: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 取代了密码子中的第二个核苷酸序列。
是否可以使用awk
或sed
执行此操作?
答案1
对“是否有可能......”这个问题回答“是”是如此诱人。
这样的事情会做吗?
awk '{l=substr($3,1,$4-1); r=substr($3,$4+1); print $0"\t"l $6 r}' genome > mutated
答案2
答案3
通过一些perl
拆分和连接:
perl -alne '
@c = split //, $F[2];
splice @c, $F[3]-1, 1, $F[5];
print join "\t", @F, join "", @c;
' data
解释:
- split 3rd column into character array @c
- replace the value indexed by the 4th column with that of the 6th
- stitch it all back together, delimited by tabs
测试-给定
$ cat data
2289 G GTG 3 0.0346505 A
2478 G ATG 2 0.0054087 C
然后
$ perl -alne '
@c = split //,$F[2]; splice @c,$F[3]-1,1,$F[5]; print join "\t",@F,join "",@c
' data
2289 G GTG 3 0.0346505 A GTA
2478 G ATG 2 0.0054087 C ACG
答案4
perl -plane 'substr($F[2],$F[3]-1,1)=$F[5]; $_.="\t$F[2]"' data
- 根据问题更改F2
substr($F[2],$F[3]-1,1)=$F[5]
- 并将其连接到输入行
$_.="\t$F[2]"