为不区分大小写的 sed 添加选项并替换 FASTA 文件中的字符串

Adding option to sed for case insensitivity and replacing a string of character in a FASTA file

我想创建一个文件,我可以在其中搜索并找到要在 Fasta 文件中更改的模式。下面的命令正在创建一个 .sh 脚本,其中包含它应该匹配和更改的所有模式:

tail -n +2 scaffold_names_2.txt | while read assemb gcenter refseq genbank ncbi; do echo -ne "sed 's/<$gcenter>/$genbank/g' | " >>script.sh; done

我的文件是这样的:

#Assembly   Genome Center name  RefSeq Accession.version    GenBank Accession.version   NCBI name
GeoFor_1.0  scaffold40  NW_005054297    JH739887    GPS_002009865
GeoFor_1.0  scaffold112 NW_005054298    JH739888    GPS_002009866
GeoFor_1.0  scaffold41  NW_005054299    JH739889    GPS_002009867
GeoFor_1.0  scaffold130 NW_005054300    JH739890    GPS_002009868
GeoFor_1.0  scaffold54  NW_005054301    JH739891    GPS_002009869

.sh 文件如下所示:

sed 's/scaffold40/JH739887/g' | sed 's/scaffold112/JH739888/g' | sed 's/scaffold41/JH739889/g' | ...

但是,我希望模式不区分大小写。我想在 sed 's/<$gcenter>/$genbank/g' | " 命令中添加一个 -e。但是,当我添加标志时,它并没有打印在我的脚本中。任何想法为什么?

tail -n +2 scaffold_names_2.txt | while read assemb gcenter refseq genbank ncbi; do echo -ne "sed -e 's/<$gcenter>/$genbank/g' | " >>script.sh; done

获得我的脚本后,我删除了最后一个管道并放入了我想要搜索和更改模式的fasta 文件。

最终目标是将您在下面的字符串中看到的 Scaffold### 替换为 JH######

>Scaffold410    275
TGCATTAATATGAGTGTGTGCTGCAAAAGTTCAGGTCATGGTCCGATCATACTTCACATTTTGGTAGCACTTTAAGCAGAGATCGGTTATCCCATTCTGTGGAAGACTCAACACTATCATAAGGTCCCACAGTTTTATTATCCCTCTGCCTCCCGGAATGCCCCCGGCAGTGAGGGGTACCATCTTCTCAGCAGTAAGGATATTCTTCAGGAGTTCCGTGTGAGCTTTCCCGGATTTAGTTCCATTTTTTAAATACTTCCCAATTCTTTGCTTTG
>Scaffold430    374
CTTTGTTAACTGAAAGAGCCTCTAAGTAGATGACCAGTGCTCAGTTAGTACAGTATGAATTTTGTTTAATGGAACAGGAAGATTTAGTATTGAGAAGCGGTTAAGGGTTTAACCCAGCCTCCTGTCTGAATGGACCTGAAGAGGGGGGCCGGGAAGAAACCCATGACTGCATTAAAGTGATAGATCTCCAGACATGGGCTAGGGAAGATTTACAAGACACTCCCTGGCCTGAGGGAGAAAATATGTTTATTGATGAGTCTTCAAGGGTGGCAGAAGGGAAGCGATTTACAGGATACACAATCATTAATGGAAGGAAATTAAAGGAAGGGGGGAGATTGTCACCCACCTGGTCAGTTCAGACAGCAGAGCTGTAT

我正在使用 bash 命令来执行此操作。但即使在更换 -e 标志后它也不起作用。

我知道我迟到了,但也许这对其他人也有用。

要解决 OP 问题,他必须像这样创建一个 script.sh:

sed -e 's/scaffold40/JH739887/gi' -e 's/scaffold112/JH739888/gi' -e 's/scaffold41/JH739889/gi' ...
  • -e 允许在同一个 sed 命令中包含各种脚本。
  • s/<searchText>/<replaceText>/gi 全局搜索和替换 g 并且 i 忽略大小写

也就是说,我认为您真正想做的是用 "GenBank Accession.version"[= 替换列 "Genome Center name" 57=] 在你的数据文件中。

如果是这种情况,可以使用此 awk 命令:

awk '{ if(NR>1)=; print }' scaffold_names_2.txt > scaffold_names_2.new.txt

说明

  • awk 是一种编程语言(类似 C 的语法),它可以处理文本文件中的行(每次一行)。
  • NR包含当前记录数
  • $i 在当前行内包含一个字段(</code>:第一个字段,<code>,第二个,依此类推)
  • print 打印当前行。

执行

$ cat scaffold_names_2.txt
#Assembly   Genome Center name  RefSeq Accession.version    GenBank Accession.version   NCBI name
GeoFor_1.0  scaffold40  NW_005054297    JH739887    GPS_002009865
GeoFor_1.0  scaffold112 NW_005054298    JH739888    GPS_002009866
GeoFor_1.0  scaffold41  NW_005054299    JH739889    GPS_002009867
GeoFor_1.0  scaffold130 NW_005054300    JH739890    GPS_002009868
GeoFor_1.0  scaffold54  NW_005054301    JH739891    GPS_002009869

$ awk '{ if(NR>1) =; print}' scaffold_names_2.txt > scaffold_names_2.new.txt

$ cat scaffold_names_2.new.txt
#Assembly   Genome Center name  RefSeq Accession.version    GenBank Accession.version   NCBI name
GeoFor_1.0 JH739887 NW_005054297 JH739887 GPS_002009865
GeoFor_1.0 JH739888 NW_005054298 JH739888 GPS_002009866
GeoFor_1.0 JH739889 NW_005054299 JH739889 GPS_002009867
GeoFor_1.0 JH739890 NW_005054300 JH739890 GPS_002009868
GeoFor_1.0 JH739891 NW_005054301 JH739891 GPS_002009869