AWK查找和替换字段值

时间:2020-01-09 10:37:17  来源:igfitidea点击:

我有如下数据:

foo bar 12,300.50 foo bar 2,300.50 abc xyz 1,22,300.50

如何使用awk从第三个字段替换all,然后将输出以以下格式传递到bc -l以获取所有数字的总和:12300.50 + 2300.50 + 1,22,300.50

您可以按以下方式使用gsub()函数。语法为:

gsub("find", "replace") 
gsub("find-regex", "replace") 
gsub("find-regex", "replace", t) 
gsub(r, s [, t]) 

在awk手册页中:

对于每个与字符串t中的正则表达式r匹配的子字符串,替换字符串s,并返回替换的数量。
如果未提供t,则使用$0。
替换文本中的&替换为实际匹配的文本。
使用&获取文字&。

您还可以使用以下语法:

gensub(r,s,h [,t])

在awk手册页中:

在目标字符串t中搜索正则表达式r的匹配项。
如果h是以g或G开头的字符串,则将r的所有匹配项替换为s。
否则,h是一个数字,指示要替换r的哪个匹配项。
如果未提供t,则改用$0。
在替换文本s中,序列\ n(其中n是从1到9的数字)可用于仅表示与第n个带括号的子表达式匹配的文本。
序列\ 0代表整个匹配文本,字符&也是如此。
与sub()和gsub()不同,修改后的字符串将作为函数的结果返回,并且原始目标字符串不会更改。

例子

创建一个数据文件cat /tmp/data.txt

foo 	bar	12,300.50
foo	bar	2,300.50
abc	xyz	1,22,300.50

键入以下awk命令:

awk '{ gsub(",","",); print  }' /tmp/data.txt

输出示例:

12300.50
2300.50
122300.50

您可以将输出传递到任何命令或计算字段的总和:

awk 'BEGIN{ sum=0} { gsub(",","",); sum +=  } END{ printf "%.2f\n", sum}' /tmp/data.txt

或构建列表并传递给bc -l:

awk '{ x=gensub(",","","G",); printf x "+" } END{ print "0" }' /tmp/data.txt   | bc -l