不能在gensub(awk)中使用sprint

时间:2020-09-10 16:12:07

标签: awk

我是awk的新手,并且想通过使用awk更改字符串(在文件中的第十列)中数字的浮点数精度: 例如:

Name_1:0.123456@123
Name_1:0.123456@123Name_2:0.333564@456
Name_1:0.123456@123Name_2:0.333564@456Name_3:0.25468@895

我想要什么:

Name_1:0.12@123
Name_1:0.12@123Name_2:0.3@456
Name_1:0.123456@123Name_2:0.333564@456Name_3:0.25@895

我可以有任意数量的“名称_”。

我认为是这样的:

awk '{$10=gensub(/(-?[0-9|.])+@/, sprintf("%.2f", "&"), "g", $10)}1'

但是似乎&在sprintf内部未被识别。

能请你帮忙吗?

1 个答案:

答案 0 :(得分:1)

在任何基于Algol的编程语言(awk,C,Ada,pascal等)中,当您编写包含2个函数foo()和bar()的语句时,如下所示:

foo(bar())

这意味着您要将bar()返回的值作为参数传递给foo()。鉴于此,您无法让bar()接受通过运行foo()作为参数填充的任何值,因为foo()直到之后 {{1} }已执行。

针对您的特定情况,而不是:

bar()

您应该使用第三个arg代替awk '{$10=gensub(/(-?[0-9|.])+@/, sprintf("%.2f", "&"), "g", $10)}1' match()来隔离您感兴趣的字符串,以便可以将gensub()称为match()之后可以进行操作,即代替尝试执行以下操作之一:

sprintf()

您将执行以下操作之一:

match()

话虽如此,以下是我认为您要尝试使用任何awk进行的操作,因为仅适用于gawk的函数对此用例无济于事:

gensub(/target/,sprintf(&))
gensub(/(xxx)(target)(yyy)/,sprintf("\\2"))