使用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