我是 Sed 的新手,想使用它删除 FASTA 文件头的一部分
我的标题格式如下:
CYTC2889-12|HM036578|Homo sapiens
我需要他们:
CYTC2889-12|Homo sapiens
到目前为止我已经(在 macOS 上运行):
sed -i '.bak' 's/ /|/1;s/ /|/1' Homo_sapiens_aligned.fas
用于获取CYTC2889-12|HM036578|Homo sapiens
。最初|
被替换为空格。也就是说,最初的标题看起来像:
CYTC2889-12 HM036578 Homo sapiens
有什么想法吗?
答案1
这正是 sed 不适合解决的问题。最好使用正确的工具来完成正确的工作。在这种情况下,像 awk 或 cut 这样的命令可以做得更好:
使用 cut 命令:
$ cut -d"|" -f1,3 Homo_sapiens_aligned.fas
CYTC2889-12|Homo sapiens
使用 awk:
$ awk 'BEGIN{FS=OFS="|"};{print $1,$3}' Homo_sapiens_aligned.fas
CYTC2889-12|Homo sapiens
答案2
$ echo'CYTC2889-12|HM036578|智人' \ | sed -re 's/^([^|]+).[^|]+(.*)/\1\2/'`
-r
- 避免\
/^...
在行首输入大量的字符
(...)
- 为了标记我们要保留的内容,分为两组
[^|]
- 匹配除|
字符之外的所有内容
+
- 至少一个字符-在输入中
.
跳过该字符- 该行剩余的所有内容(此处)|
.*
\1
- 第一组
\2
- 第二组,其中包含|
前面的 - 字符。
答案3
如果您想使用 sed,您可以尝试:
sed 's/\(.*\)|\(.*\)|\(.*\)/\1|\3/' Homo_sapiens_aligned.fas
。
如果结果与您想要的一致,您可以添加“-i”选项来覆盖文件:
sed 's/\(.*\)|\(.*\)|\(.*\)/\1|\3/' -i.bak Homo_sapiens_aligned.fas
意义:
(.*)
是任意长度的通用字符串。\
是括号所需的转义字符。\(.*\)|\(.*\)|\(.*\)
是由三个字符串组成的序列,中间用|
\1|\3
意思是说你想用一个只包含第一部分和第三部分的字符串来替换上面的字符串序列。