awk:使用多个分隔符从单个字段中的值计算总和

awk:使用多个分隔符从单个字段中的值计算总和,awk,delimiter,integer-arithmetic,Awk,Delimiter,Integer Arithmetic,与我的另一个帖子相关。。。 , 在这篇文章中,我说我可以很容易地用UNIX工具(ahem)实现同样的功能。我发现它比预期的要乱一点。我正在寻找一个awk解决方案。对以下方面有何建议 这是我的原帖,转述如下: # 我想使用awk解析来自管道分隔的平面文件的数据。其中一个字段的子格式如下所示。我的最终状态是对字段中的整数求和,但我这里的问题是如何使用awk对字段中的数值求和。子格式的模式将始终是所需整数前面加一个波浪号(~),后面加一个星号(*),但字段中的最后一个除外。子字段的数量也可能有所不同(

与我的另一个帖子相关。。。 , 在这篇文章中,我说我可以很容易地用UNIX工具(ahem)实现同样的功能。我发现它比预期的要乱一点。我正在寻找一个awk解决方案。对以下方面有何建议

这是我的原帖,转述如下:

# 我想使用awk解析来自管道分隔的平面文件的数据。其中一个字段的子格式如下所示。我的最终状态是对字段中的整数求和,但我这里的问题是如何使用awk对字段中的数值求和。子格式的模式将始终是所需整数前面加一个波浪号(~),后面加一个星号(*),但字段中的最后一个除外。子字段的数量也可能有所不同(我的示例中有5个,但可能有更多或更少)。4个字符的标记名并不重要

下面是一个示例:

|GADS~55.0*BILK~0.0*BOBB~81.0*HETT~32.0*IGGR~51.0|

从这个例子中,我想要处理的是最终的数字219。再一次,我可以进一步研究求和部分;只是想知道数字

# 我的解决方案目前需要两个awk语句。首先使用gsub在我的目标字段中用“*”分隔符替换“~”,77:

awk-F'|''BEGIN{OFS=“|”}{gsub(“~”,“*”,$77);print}'file_1>file_2

我的第二个awk语句是计算目标字段77(最后一个字段)上的数字和,并用计算值替换它。它建立在这样一个假设之上,即文件中其他任何地方都不会有其他星号(*)。我同意。它对大多数例子都有效,但对其他例子无效。我的直觉告诉我,这不是一个可靠的答案。有什么想法吗?我在另一篇关于SQL的文章中的建议非常好,但由于一些无关的愚蠢原因,我无法实现它们

awk-F'*'{if(NF>=2){s=0;for(i=1;i要从示例中获得总和(219),可以使用以下方法:

awk -F'[^0-9.]+' '{for(i=1;i<=NF;i++)s+=$i;print s}' file
要从示例中获得总和(219),可以使用以下公式:

awk -F'[^0-9.]+' '{for(i=1;i<=NF;i++)s+=$i;print s}' file

谢谢Kent。我喜欢它的发展方向。所以它看起来像是使用regex base(和increment?)作为分隔符来解析整个字段。好东西。现在我正试图将它构建到一个语句中,希望它“作用”于文件中的一个字段(编号77),其中分隔符已经被建立为管道“|”。这可以在一个语句中完成,还是需要一系列命令?我正在考虑用管道传输一个sed语句来使用替换。谢谢Kent。我喜欢这一步。所以看起来像是使用正则表达式base(和increment?)作为一个分隔符来解析整个字段。很好。现在我正试图将其构建到一个语句中,希望它“作用”于文件中的一个字段(编号77),其中分隔符已被建立为管道“|”。这可以在一个语句中完成,还是我需要一系列命令?我正在考虑使用一个sed语句来替换您的问题,以消除所有的内联历史记录,然后发布您当前的问题,包括一个简洁、可测试的示例输入和预期的输出。您的问题是消除所有的内联历史记录只需发布您当前的问题,包括一个简洁、可测试的示例输入和预期输出。