我正在尝试使用不同的语法重现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
答案 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") }'