AWK - 替换匹配行上的特定列,然后打印其他行

时间:2016-11-07 16:42:11

标签: awk sed

我正在尝试更改“标题”中的列/字段。数千行长的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。

1 个答案:

答案 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;仅")括号内表达式的引用。