Trim FASTA headers 与 sed

Trim FASTA headers with sed

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

>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.*,\).*$//' file

谢谢!

您可以使用

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

参见online demo

详情

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

如果您需要替换相同的文件内容,请使用

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

您能否尝试在 GNU awk.

中使用显示的示例进行跟踪、编写和测试
awk '
match([=10=],/chromosome [^,]*/){
  print substr([=10=],1,1) substr([=10=],RSTART+11,RLENGTH-11)
}
'  Input_file

解释:为以上添加详细解释。

awk '                              ##Starting awk program from here.
match([=11=],/chromosome [^,]*/){      ##Using match function to match regex chromosome till comma comes here.
  print substr([=11=],1,1) substr([=11=],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([=12=],/chromosome [^,]*/){
  print substr([=12=],1,1) substr([=12=],RSTART+11,RLENGTH-11)
}
'  Input_file > temp && mv temp Input_file

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

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

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

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

两种方法的作用完全一样。在以 > 开头的行中,删除以 , 开头的字符串直到结尾,并将直到最后一个 space 的所有内容替换为 >。后者通过简单调用最后一个字段在 awk 中完成。

另一个sed

$ sed -E '/chromosome/s/^>.* (.+),.*/>/' file

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

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