与我的另一篇文章相关... parsing a sql string for integer values with multiple delimiters, 我说我可以用UNIX工具轻松完成相同的工作(咳咳)。我发现它比预期的要乱一些。我正在寻找一个awk解决方案。有关以下内容的任何建议吗?
这是我的原帖,转述:
我想使用awk来解析来自管道分隔的平面文件的数据。其中一个字段的子格式如下。我的最终状态是对字段内的整数求和,但我的问题是要查看使用awk对字段中的数值求和的方法。子格式的模式总是在所需的整数前面加一个波浪号(〜),后面跟一个星号(*),除了字段中的最后一个。子字段的数量也可能不同(我的例子有5个,但可能更多或更少)。 4 char TAG名称并不重要。
所以这是一个示例:
| GADS〜55.0 * BILK〜0.0 * BOBB〜81.0 * HETT〜32.0 * IGGR〜51.0 |
从这个例子中,我想要处理的所有内容都是最终的数字219.再一次,我可以将sum部分作为进一步的步骤;只是对获得数字感兴趣。
我的解决方案目前需要两个awk语句。首先使用gsub替换'〜'用' *'我的目标字段中的分隔符,77:
awk -F' |' '开始{OFS =" |"} {gsub("〜"," *",$ 77);打印}' file_1> file_2
我的第二个awk语句是计算目标字段77上的数字和,这是最后一个字段,并将其替换为计算值。它建立在假设文件中没有其他星号(*)的基础上。我没关系。它适用于大多数示例,但不适用于其他示例,我的直觉告诉我,这不是一个强大的答案。有任何想法吗?关于我的另一篇关于SQL的帖子的建议很棒,但由于无关的愚蠢原因,我无法实现它们。
awk -F' *' ' {if(NF> = 2){s = 0; for(i = 1; i< = NF; i ++)s = s + $ i; print substr($ 1,1,length($ 1)-4)s;} else print}' file_2> file_3
答案 0 :(得分: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