我试图将 fasta 标头中的字符保留在第一个和第二个冒号之间。由于我的编码技能非常有限,我尝试使用 sed 和 awk 失败了。
在:
>TRINITY_DN10034_c0_g1:TRINITY_DN10034_c0_g1_i1:g.1561:m.1561
CCAGCGCCACGGAGGGCGAAGGCGAAGGCGGTGGTTTTGAACGATGAGGTGCCGCCGGTG
>TRINITY_DN10322_c0_g1:TRINITY_DN10322_c0_g1_i2:g.1424:m.1424
GATCCGCCTTCTATAACTGGAAAAGAAGAGGATGAGGTGCCGCCGATGAGTCTACCTTCT
预期的:
>TRINITY_DN10034_c0_g1_i1
CCAGCGCCACGGAGGGCGAAGGCGAAGGCGGTGGTTTTGAACGATGAGGTGCCGCCGGTG
>TRINITY_DN10322_c0_g1_i2
GATCCGCCTTCTATAACTGGAAAAGAAGAGGATGAGGTGCCGCCGATGAGTCTACCTTCT
有什么帮助吗?
答案1
和awk
:
awk -F: '{ if (NF==1) { print } else { print ">"$2 } }' file
或者稍微压缩一点
awk -F: '{ print (NF==1) ? $1 : ">"$2 }' file
:
如果该行只有一个字段,则使用字段分隔符并打印第一个字段,>
否则打印第二个字段。
和sed
:
sed 's/^>[^:]\+:\([^:]\+\).*/>\1/' file
答案2
与标准sed
:
$ sed '/^>/{ s/[^:]*:/>/; s/:.*//; }' file.fa
>TRINITY_DN10034_c0_g1_i1
CCAGCGCCACGGAGGGCGAAGGCGAAGGCGGTGGTTTTGAACGATGAGGTGCCGCCGGTG
>TRINITY_DN10322_c0_g1_i2
GATCCGCCTTCTATAACTGGAAAAGAAGAGGATGAGGTGCCGCCGATGAGTCTACCTTCT
这将两个替换应用于s/[^:]*:/>/
以a 开头的s/:.*//
所有行(fasta 标题行)。file.fa
>
第一次替换将替换行的开头,直到第一个:
字符(包括第一个字符)>
。
第二次替换将删除从:
结果数据中的第一个(:
原始行中的第二个)到该行末尾的所有内容。
这将留下第二个:
- 分隔字段,前缀为>
.
与标准awk
:
$ awk -F ':' '/^>/ { $0 = ">" $2 } { print }' file.fa
>TRINITY_DN10034_c0_g1_i1
CCAGCGCCACGGAGGGCGAAGGCGAAGGCGGTGGTTTTGAACGATGAGGTGCCGCCGGTG
>TRINITY_DN10322_c0_g1_i2
GATCCGCCTTCTATAACTGGAAAAGAAGAGGATGAGGTGCCGCCGATGAGTCTACCTTCT
这将用作:
字段分隔符,当遇到以 开头的行时>
,它将替换完整行,>
后跟第二个:
- 分隔字段。所有行,无论是否修改,都会被打印。
答案3
建议的解决方案:
使用 GNU sed
cut -f2 -d':' file | sed '1~2s/^/>/'
输出:
>TRINITY_DN10034_c0_g1_i1
CCAGCGCCACGGAGGGCGAAGGCGAAGGCGGTGGTTTTGAACGATGAGGTGCCGCCGGTG
>TRINITY_DN10322_c0_g1_i2
GATCCGCCTTCTATAACTGGAAAAGAAGAGGATGAGGTGCCGCCGATGAGTCTACCTTCT
答案4
有多种方法可以处理此 PBM,其中一些是:
$ cut -d: -f2 | sed -e '$!N;s/^/>/' file
$ awk -F: '/^>/{$0 = ">" $2}1' file
$ perl -F: -pale ' s/^>\K.*/$F[1]/' file
$ sed -e '
/\n/{P;d;}
/^>/y/:/\n/
s/\n/&>/;//D
' file
结果
>TRINITY_DN10034_c0_g1_i1
CCAGCGCCACGGAGGGCGAAGGCGAAGGCGGTGGTTTTGAACGATGAGGTGCCGCCGGTG
>TRINITY_DN10322_c0_g1_i2
GATCCGCCTTCTATAACTGGAAAAGAAGAGGATGAGGTGCCGCCGATGAGTCTACCTTCT