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

Zoe*_*tin 0 sed awk text-processing bioinformatics

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

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

AATTCTTGCA 4 [A/T]
AATTCCTTCG 7 [C/T]
AATTCAACAA 2 [T/C]
Run Code Online (Sandbox Code Playgroud)

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

AAT[A/T]CTTGCA
AATTCC[C/T]TCG
A[T/C]TTCAACAA
Run Code Online (Sandbox Code Playgroud)

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

提前致谢!

Adm*_*Bee 5

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

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

该选项-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
Run Code Online (Sandbox Code Playgroud)

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