根据另一列的指令更改一列中的字符

根据另一列的指令更改一列中的字符

我正在尝试设置一个脚本,根据我在 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 取代了密码子中的第二个核苷酸序列。

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

答案1

对“是否有可能......”这个问题回答“是”是如此诱人。

这样的事情会做吗?

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

答案2

Perl解决方案:

perl -lane 'substr $n = $F[2], $F[3] - 1, 1, $F[5]; print join "\t", $_, $n' -- file
  • -n逐行读取输入
  • -l从输入中删除换行符并将其添加到打印s
  • -a将空白处的每一行拆分到 @F 数组中
  • 子字符串详情

答案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
  • 根据问题更改F2substr($F[2],$F[3]-1,1)=$F[5]
  • 并将其连接到输入行$_.="\t$F[2]"

相关内容