用样本名称替换行名称的一部分

用样本名称替换行名称的一部分

我有多个名为 p1_500sc.fasta、p2_500sc.fasta 的样本...每个文件如下所示:

>NODE_60_length_504_cov_1.580902
TATATCGCCGTAGATAGACGAATACGGGATTTTGAAATGACTGATATATTCAAGCACATC
CTGTTCAGTCCAAAATGACATCGGCTTCGATTTCGGGATTGCCCCCGCAAAGTTGTTACA
>NODE_61_length_503_cov_4.457447
GATATGGGCCGGTGAGCATGCTGTCACATTTTGGGCAGGTGCCGAGGATTATGAGCTCGT
CTTCCGGCGTCAACGCTTGTTCGTTGCGTCTGGTGATGTGTTCCAGAGCGGCATAGTCGT
>NODE_62_length_500_cov_4.037534
CTCGTTCTTGCACTCCTGAATGAAGCGAATCTCTGACGAGGGTATTCCATAATCCTCTAT
CAGCTTACGCTTGATTTCTG
>NODE_63_length_500_cov_1.718499
GGAGGATATCAATGCCCTTATACTGCTTCTCAACAGTAGGAGTAATGCGGATACCCAAAA
CGGTCTTAGGGTTCTCCAGCAACTTCATGGCATTCCAACGCTTCAAGTCATCCATGCGGA
AGCCTTCGGCT

正如您所见,有一个 NODE 短语。对于每个文件,我想更改示例名称中文件指示符的“NODE”:p1/ p2/ p100...pn

文件 p1_500sc.fasta 的输出应如下所示:

>p1_60_length_504_cov_1.580902
TATATCGCCGTAGATAGACGAATACGGGATTTTGAAATGACTGATATATTCAAGCACATC
CTGTTCAGTCCAAAATGACATCGGCTTCGATTTCGGGATTGCCCCCGCAAAGTTGTTACA
>p1_61_length_503_cov_4.457447
GATATGGGCCGGTGAGCATGCTGTCACATTTTGGGCAGGTGCCGAGGATTATGAGCTCGT
CTTCCGGCGTCAACGCTTGTTCGTTGCGTCTGGTGATGTGTTCCAGAGCGGCATAGTCGT
>p1_62_length_500_cov_4.037534
CTCGTTCTTGCACTCCTGAATGAAGCGAATCTCTGACGAGGGTATTCCATAATCCTCTAT
CAGCTTACGCTTGATTTCTG
>p1_63_length_500_cov_1.718499
GGAGGATATCAATGCCCTTATACTGCTTCTCAACAGTAGGAGTAATGCGGATACCCAAAA
CGGTCTTAGGGTTCTCCAGCAACTTCATGGCATTCCAACGCTTCAAGTCATCCATGCGGA
AGCCTTCGGCT

对于 p123_500sc.fasta 文件

>p123_2_length_456_cov_4.453333
GATATGGGCCGGTGAGCATGCTGTCACATTTTGGGCAGGTGCCGAGGATTATGAGCTCGT
CTTCCGGCGTCAACGCTTGTTCGTTGCGTCTGGTGATGTGTTCCAGAGCGGCATAGTCGT
>p123_356_length_3_cov_4.037908
CTCGTTCTTGCACTCCTGAATGAAGCGAATCTCTGACGAGGGTATTCCATAATCCTCTAT
CAGCTTACGCTTGATTTCTG

对于任何其他样本也是如此。样本从p1开始,可以达到p150。

答案1

bash+sed解决方案:

for f in p[0-9]*.fasta; do
    pfx="${f%%_*}"
    sed -i "s/^>NODE/>$pfx/" "$f"
done

  • pfx="${f%%_*}"- 截断文件名的右侧部分直到最后_;将结果赋值给变量pfx
  • sed -i "s/^>NODE/>$pfx/"-用变量就地替换>NODE子字符串$pfx

答案2

使用 GNU awk,您可以通过单个命令调用来完成此操作:

gawk -i /usr/share/awk/inplace.awk -F_ -v OFS=_ '
  BEGINFILE {
    node = FILENAME
    sub(".*/", "", node)
    sub("_.*", "", node)
  }
  $1 == ">NODE" {$1 = ">" node}
  {print}' ./p*_*.fasta

任何状况之下,不使用-i inplaceas尝试首先从当前工作目录gawk加载inplace扩展(asinplace或),有人可能已经在其中植入了恶意软件。随系统提供的扩展inplace.awk的路径可能会有所不同,请参阅输出inplacegawkgawk 'BEGIN{print ENVIRON["AWKPATH"]}'

答案3

这将循环遍历每个文件,将文件名中下划线之前的所有内容分配给变量sample,然后使用以下命令替换文件中>NODE的 for :$samplesed

for file in /path/to/files/*;do
  sample=$(echo "${file}" | sed s/_.*//)
  sed -i "s/^>NODE/${sample}/" ${file}
done

相关内容