gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 18:02:55 30 4
gpt4 key购买 nike

我正在尝试更改数千行长的 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”,但我想我不明白如何在这种情况下使用它。

有什么建议吗?我知道我很接近并且正在用我的头敲击键盘。

谢谢,LP。

最佳答案

你已经差不多了。你只是用你的 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是对搜索正则表达式中第一个(在本例中为“唯一”)括号表达式的引用。

关于AWK - 替换匹配行上的特定列,然后打印其他行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40470194/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com