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