使用AWK查找和替换值
时间:2019-11-20 08:52:57 来源:igfitidea点击:
如何使用awk求和?
假设有下面的数据:
shouji 12,300.50 diannao 23,300.50 xinpian 11,22,300.50
如何将第二列中的逗号替换掉,并计算总和?
我们可以使用gsub()函数。
语法为:
gsub("find", "replace") gsub("find-regex", "replace") gsub("find-regex", "replace", t) gsub(r, s [, t])
对于每个与字符串t中的正则表达式r匹配的子字符串,替换字符串s,并返回替换的数量。
如果未提供t,则使用$0。替换文本中的&替换为实际匹配的文本。使用&表示字符&。
您还可以使用以下语法:
gensub(r,s,h [,t])
在目标字符串t中搜索正则表达式r的匹配项。如果h是以g或G开头的字符串,则将r的所有匹配项替换为s。否则,h是一个数字,指示要替换r的哪个匹配项。如果未提供t,则改用$0。在替换文本s中,序列\ n(其中n是从1到9的数字)可用于仅表示与第n个带括号的子表达式匹配的文本。序列\ 0代表整个匹配文本。与sub()和gsub()不同,修改后的字符串将作为函数的结果返回,并且原始目标字符串不会更改。
示例
创建一个文件cat /tmp/data.txt
shouji 12,300.50 diannao 23,300.50 xinpian 11,22,300.50
执行awk命令获取第二列:
awk '{ gsub(",","",); print }' /tmp/data.txt
输出示例:
shouji 12,300.50 diannao 23,300.50 xinpian 11,22,300.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