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