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

LP_*_*640 4 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
 ...
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.

gho*_*oti 6

你几乎得到了它.你只是用你的东西来过度思考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是对搜索正则表达式中第一个(在这种情况下"仅")括号中的表达式的引用.