仅当行不包含特定字符串(awk)时,才在行内查找/替换

仅当行不包含特定字符串(awk)时,才在行内查找/替换,awk,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 ($

我正在尝试使用不同的语法复制一个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
最后两个命令都提供以下输出。为什么它们给出不同的输出?我缺少什么使最后两个命令都给出所需的输出

>NAME_123_CONSENSUS
4
4
5
>NAME2_48_TEST
3

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

awk '{ for(j=1; j<=NF; j++) if ($j ~ "_") print; else { gsub("A","1",$0); print } }'
或者使用GNU Awk中提供的
gensub()
,返回修改后的字符串,您可以使用该字符串打印
。更多信息请访问


awk'{for(j=1;j
gsub
不返回替换项,它修改参数字符串(默认为
$0
)原地。它返回替换的数量。如果需要,gawk的gensub将返回修改后的字符串。。谢谢。因此,在
awk
的循环中使用gsub不可能做到这一点?只是想知道,这看起来很像FASTA文件,但没有
。可以肯定的是,忘记了这些吗?是的,它来自FASTA文件。现在编辑了这个例子。你推荐使用FASTA文件的不同方法吗?非常好。谢谢。我发布的第三个命令可以像这样编辑
awk'{if($0~“”)print;else{gsub(“a”,“1”,“$0”);print}'test.txt
@p-robot从技术上讲是的,但您永远不会真正编写该命令行,而是将其写成
awk'!/{gsub(/A/,“1”}1'test.txt
(请注意,gsub()的第一个参数是正则表达式,而不是字符串).如果你不知道你想通过不同的方式实现什么,你很难就正确的方法向你提供建议。
awk '{ for(j=1; j<=NF; j++) if ($j ~ "_") print; else { gsub("A","1",$0); print } }'
awk '!/_/{ gsub("A", "1") }1'
awk '{ for(j=1; j<=NF; j++) if ($j ~ "_") print; else print gensub(/A/, "1", "g") }'