如何将一列中另一列指示的位置处的字符替换为不同列中的字​​符串

如何将一列中另一列指示的位置处的字符替换为不同列中的字​​符串

我对生物信息学相当陌生(这是我的第一篇文章!),我希望对困扰我的任务提供一些帮助。

我有一个包含三列的制表符分隔数据表:

AATTCTTGCA 4 [A/T]
AATTCCTTCG 7 [C/T]
AATTCAACAA 2 [T/C]

我想用第三列中的字符串替换第二列指示的位置处的第一列中的字符,以便输出为:

AAT[A/T]CTTGCA
AATTCC[C/T]TCG
A[T/C]TTCAACAA

我现在正在学习各种教程,当我有一些带有sed/ 的(失败的)命令时,我会更新我的帖子awk

提前致谢!

答案1

以下awk命令应该完成该任务:

awk -F"\t" '{printf "%s%s%s%s",substr($1,1,$2-1),$3,substr($1,$2+1),ORS}' input.txt

该选项-F将字段分隔符设置为TAB。然后程序将打印(使用该printf()函数)每一行

  • 字段 1 从开头到(但不包括)字段 2 中指示的字符位置的子字符串
  • 字段 3 中包含的字符串
  • 字段 1 的剩余部分,从字段 2 中指示的字符位置开始
  • “输出记录分隔符”,默认为换行符

从而有效地用字段 3 的内容替换指示的字符。

笔记事后看来,如此大量的显式格式化控制实际上是不必要的,并且该程序可以缩写为

awk -F"\t" '{print substr($1,1,$2-1) $3 substr($1,$2+1)}' input.txt

警告:程序假定字段 2 中的字符位置始终是合理的,即大于 0 且小于或等于字段 1 的总长度。如果文件可能已损坏,则需要进行更多错误检查。

答案2

使用(以前称为 Perl_6)

raku -ne 'my ($a,$b,$c) = .split("\t"); substr-rw($a, $b-1, 1) = $c; put $a;' 

输入示例:

AATTCTTGCA  4   [A/T]
AATTCCTTCG  7   [C/T]
AATTCAACAA  2   [T/C]

示例输出:

AAT[A/T]CTTGCA
AATTCC[C/T]TCG
A[T/C]TTCAACAA

-ne简而言之,使用命令行标志逐行读入数据。每行都位于split选项卡上,并分配给标量$a$b$c。 “substring-rewrite”命令substr-rw用于获取$a核苷酸序列并将字符串分配到由长度1$c定义的位置(即替换1个核苷酸)。$b-1修改后的$a核苷酸序列就出来了put

https://docs.raku.org/routine/substr-rw
https://raku.org

相关内容