仅在行中不包含特定字符串(awk)的情况下在行中查找/替换

时间:2019-05-24 08:36:56

标签: awk

我正在尝试使用不同的语法重现awk命令。我有一个看起来像这样的文件(test.txt):

>NAME_123_CONSENSUS
GACTATACA
ATACTAGA
>NAME2_48_TEST
ATAGCGA

,我希望使用不同的awk语法将所有出现的“ A”替换为“ 1”。我可以使用以下行解决此问题:

awk '!/_/{gsub("A", "1"); 1' test.txt

但是,我无法使用for循环来获得相同的结果,

awk '{for(j=1; j<=NF; j++) if ($j ~ "_") print; else print gsub("A","1")}' test.txt

也不使用以下输入

awk '{ if ($0 ~ "_") print $0; else print gsub("A", "1"); }' test.txt

最后两个命令均提供以下输出。为什么它们给出不同的输出,而我又想使最后两个命令都给出所需的输出呢?

>NAME_123_CONSENSUS
4
4
5
>NAME2_48_TEST
3

1 个答案:

答案 0 :(得分:1)

您在此处错误地使用了gsub()函数。 sub() / gsub()函数返回已进行替换的数目,而修改后的字符串为 not 。您将要修改的字符串设置为最后一个参数,然后将其打印回

awk '{ for(j=1; j<=NF; j++) if ($j ~ "_") print; else { gsub("A","1",$0); print } }'

这表示您的第一个命令是最有效/简洁的编写方式。请注意,您在OP中缺少}。它应该写为

awk '!/_/{ gsub("A", "1") }1'

或者使用GNU Awk中提供的gensub(),将返回的修改后的字符串用于print。在String-Functions of GNU Awk

上了解更多
awk '{ for(j=1; j<=NF; j++) if ($j ~ "_") print; else print gensub(/A/, "1", "g") }'