我是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内部未被识别。
能请你帮忙吗?
答案 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"))