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
对于包含染色体的行,找到逗号前的字符,并用保持初始 >
符号的标记替换记录。
我有一个包含以下 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
对于包含染色体的行,找到逗号前的字符,并用保持初始 >
符号的标记替换记录。