2016-06-13 70 views
0

与另一篇文章相关我有... parsing a sql string for integer values with multiple delimiters, 在哪里我可以很容易地完成与UNIX工具(ahem)相同。我发现它比预期的更杂乱。我正在寻找awk解决方案。对以下内容有何建议?awk:计算从单个字段中的值与多个分隔符的总和

这是我原来的职位,转述:

我想用awk来解析从平面文件,它是管道分隔源数据。其中一个字段的格式如下。我的最终状态是对字段中的整数进行求和,但我的问题在于查看使用awk对字段中的数值求和的方法。子格式的模式将始终在希望的整数前面加一个代字号(〜),后面加一个星号(*),除了字段中的最后一个。子字段的数量也可能会有所不同(我的示例有5个,但可能更多或更少)。 4个字符的TAG名称并不重要。

所以这里是一个示例:

| 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 < = NF; i ++)s = s + $ i;打印SUBSTR($ 1,1,长度($ 1)-4)S;}其他打印}” file_2> file_3

+0

[编辑]你的问题解决掉所有的内联历史,只是后您的当前问题包括[MCVE]以简洁,可测试样品的输入和预期的输出。 –

回答

2

为了让您的例子总和(219),您可以使用此:

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

219.00如下:

awk -F'[^0-9.]+' '{for(i=1;i<=NF;i++)s+=$i;printf "%.2f\n", s}' file 
+0

谢谢肯特。我喜欢这里的情况。所以它看起来像使用正则表达式基(和增量?)作为分隔符来解析该字段。好东西。现在我试图将它建立到一个声明中,要求它在分隔符已经建立为管道“|”的文件内的一个字段(编号77)上“起作用”。这可以在一个声明中完成,还是需要一系列命令?我正在考虑可能使用sed语句来使用替代 – sirabhorn