我正在尝试改变数千行长的DNA序列的"标题"行中的列/字段.具体来说,我想更改标题的第一个字段(compX_seqy),它始终以">"开头:
前两个序列的一个例子:
#cat example
>comp0_seq1 444 [12:23]
AGAGGACAC
GATCCAACATA
AGASCAC
>comp0_seq2 333 [12:32:599:1]
GTCGATC
CYAACY
CCCCA
...
Run Code Online (Sandbox Code Playgroud)
我想在第一列的末尾添加一个"A",对于所有以">"开头的行,
comp0_seq1A
然后打印行的其余部分,然后打印下一行(序列),直到到达下一行">"行(并重复).
我希望输出看起来像这样:
>comp0_seq1A 444 [12:23]
AGAGGACAC
GATCCAACATA
AGASCAC
>comp0_seq2A 333 [12:32:599:1]
GTCGATC
CYAACY
CCCCA
...
Run Code Online (Sandbox Code Playgroud)
我先试了一下:
awk '$1=$1"A"' example
>comp0_seq1A 444 [12:23]
AGAGGACACA
GATCCAACATAA
AGASCACA
>comp0_seq2A 333 [12:32:599:1]
GTCGATCA
CYAACYA
CCCCAA
A
A
Run Code Online (Sandbox Code Playgroud)
它为所有行的第一个字段添加了一个A,所以并不完全.
然后我尝试了这个,使用正则表达式只替换以">"开头的行
# awk '/^>/ {print $1=$1"A";getline;print $0}' example
>comp0_seq1A
AGAGGACAC
>comp0_seq2A
GTCGATC
Run Code Online (Sandbox Code Playgroud)
但是这只会在比赛结束后打印出第一行.那么,如何在匹配/替换之后打印所有/任何行,直到下一个">"?我尝试使用'next',但我想我不明白如何在这种情况下使用它.
有什么建议?我知道我很亲密,正在敲我的键盘.
Thx,LP.
你几乎得到了它.你只是用你的东西来过度思考getline
.
在awk
,以下应该工作:
$ awk '/^>/ {$1=$1"A"} 1' file.txt
Run Code Online (Sandbox Code Playgroud)
这通过在与正则表达式匹配的所有行上以花括号运行命令来工作^>
.将1
在年底是AWK短手,说:"打印当前行".
替换的另一个选择就是使用sed
:
$ sed '/^>/s/ /A /' file.txt
Run Code Online (Sandbox Code Playgroud)
这通过搜索匹配相同正则表达式的行,然后用字符串(/A /
)替换第一个空格来工作.sed
默认情况下会打印每一行,因此不需要显式打印.
或者如果你喜欢用第一个"字段"而不是第一个"字段分隔符"替换的东西,这可以工作:
$ sed 's/^\(>[^ ]*\)/\1A/' file.txt
Run Code Online (Sandbox Code Playgroud)
默认情况下,正则sed
表达式是"BRE",因此需要对分组括号进行转义.这\1
是对搜索正则表达式中第一个(在这种情况下"仅")括号中的表达式的引用.