【问题标题】:Trim FASTA headers with sed使用 sed 修剪 FASTA 标头
【发布时间】:2021-02-06 16:39:37
【问题描述】:

我有一个包含以下标题(以 > 开头的行)的参考基因组,我想将其重命名为染色体的数字/字母。我想要一个 sed 语句来做这个系统的替换,但我是 sed 的新手。文件的其他地方是额外的头文件,应该保持不变,并且头文件之间的基因序列应该保持不变。

>ST078050.1 Ovis aries is a sheep chromosome 1, whole genome shotgun sequence
>ST078051.1 Ovis aries is a sheep chromosome 2, whole genome shotgun sequence
>ST078052.1 Ovis aries is a sheep chromosome 3, whole genome shotgun sequence
>ST078053.1 Ovis aries is a sheep chromosome 4, whole genome shotgun sequence
>ST078054.1 Ovis aries is a sheep chromosome 5, whole genome shotgun sequence
>ST078055.1 Ovis aries is a sheep chromosome 6, whole genome shotgun sequence
>ST078056.1 Ovis aries is a sheep chromosome 7, whole genome shotgun sequence
>ST078057.1 Ovis aries is a sheep chromosome 8, whole genome shotgun sequence
>ST078058.1 Ovis aries is a sheep chromosome 9, whole genome shotgun sequence
>ST078059.1 Ovis aries is a sheep chromosome 10, whole genome shotgun sequence
>ST078079.1 Ovis aries is a sheep chromosome X, whole genome shotgun sequence
>ST078080.1 Ovis aries is a sheep chromosome Y, whole genome shotgun sequence

输出应该是:

>1
>2
>3
>4
>5
>6
>7
>8
>9
>10
>X
>Y

我尝试了以下,但它不正确。

sed 's/^.*\(chromosome.*,\).*$/\1/' file

谢谢!

【问题讨论】:

  • 这可能会有所帮助:awk '{print ">" substr($1, 1, length($1)-1)}' FPAT='[^ ]+,' file
  • 那么,>是文件内容的一部分吗?我have updated my answer.

标签: awk sed fasta


【解决方案1】:

您能否尝试在 GNU awk 中使用所示示例进行跟踪、编写和测试。

awk '
match($0,/chromosome [^,]*/){
  print substr($0,1,1) substr($0,RSTART+11,RLENGTH-11)
}
'  Input_file

说明:为上述添加详细说明。

awk '                              ##Starting awk program from here.
match($0,/chromosome [^,]*/){      ##Using match function to match regex chromosome till comma comes here.
  print substr($0,1,1) substr($0,RSTART+11,RLENGTH-11)
                                   ##Printing sub string to print 1st character then substring of matched regex removing chromosome from it.
}
' Input_file                       ##Mentioning Input_file here.

一旦您对上述命令显示的结果感到满意,请尝试以下命令将输出保存到 Input_file 本身。

awk '
match($0,/chromosome [^,]*/){
  print substr($0,1,1) substr($0,RSTART+11,RLENGTH-11)
}
'  Input_file > temp && mv temp Input_file

【讨论】:

  • 是的,这可以工作并给出正确的输出,但它会替换文件中的行吗?
  • @HLudwig,确定要将输出保存到 Input_file 本身,请在我的代码最后附加`> temp && mv temp Input_file`,让我现在也编辑我的答案,干杯。
【解决方案2】:

假设以上只是实际fasta文件的一些头文件,剩下的序列还在文件中,那么下面的解决方案就可以了:

$ sed '/^>/{s/,.*//;s/^.* />/}' file.fasta
$ awk '/^>/{sub(/,.*$/,"");$0=">"$NF}1' file.fasta

这两种方法的作用完全相同。在以> 开头的行中,删除以, 开头的字符串直到最后,并将最后一个空格之前的所有内容替换为>。后者通过简单地调用最后一个字段在 awk 中完成。

【讨论】:

  • 这太棒了!有用。即使对于其他标题行,它也会通过 contig 编号以提供信息的方式缩短它们。
【解决方案3】:

使用 GNU sed、正则表达式和反向引用:

sed -E 's/(.).* ([^ ]+),.*/\1\2/' file

【讨论】:

    【解决方案4】:

    另一个sed

    $ sed -E '/chromosome/s/^>.* (.+),.*/>\1/' file
    
    >1
    >2
    >3
    >4
    >5
    >6
    >7
    >8
    >9
    >10
    >X
    >Y
    

    对于包含染色体的行,找到逗号前的字符,并将记录替换为保留初始 > 符号的标记。

    【讨论】:

      【解决方案5】:

      你可以使用

      sed -E 's/^>.*chromosome ([[:alnum:]]+),.*$/>\1/' file > newfile
      

      请参阅online demo

      详情

      • -E - 启用 POSIX ERE 语法
      • ^>.*chromosome ([[:alnum:]]+),.*$ - 找到字符串的开头 (^),然后是 >、任何文本 (.*)、chromosome 单词、空格,然后将任何一个或多个字母数字字符捕获到第 1 组中,然后匹配逗号和字符串的其余部分
      • >\1 - 用 > 和 Group 1 的内容替换匹配的行(这里是一行)。

      如果你需要替换相同的文件内容使用

      sed -i -E 's/^>.*chromosome ([[:alnum:]]+),.*$/>\1/' file                   # GNU sed
      sed -i '' -E 's/^>.*chromosome ([[:alnum:]]+),.*$/>\1/' file                # FreeBSD sed
      sed 's/^>.*chromosome \([[:alnum:]]*\),.*$/>\1/' file > tmp && mv tmp file  # any sed, POSIX BRE syntax
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多