AWK:模式匹配多行数据,可变行号

时间:2015-12-23 13:15:26

标签: regex linux awk multiline

我正在尝试编写一个分析管道数据的脚本。问题是,单个元素以可变数量的行描述。查看示例数据集:

3 14 -30.48 17.23
4  1 -18.01 12.69
4  3 -11.01  2.69
8 12 -21.14 -8.76
8 14 -18.01 -5.69
8 12 -35.14 -1.76
9  2  -1.01 22.69
10 1 -88.88 17.28
10 1   -.88 14.28
10 1   5.88  1.28
10 1  -8.88 -7.28

在这种情况下,第一个条目定义了以下数据所属的事件。在事件编号8的情况下,我们有3行数据。为了简化我想要解决的相当复杂的问题,让我们想象一下,我想计算以下表达式:

sum_i($2 * ($3 + $4))

我接管属于给定元素的所有行。我想要生成的输出看起来像:

3=-185.5   [14(-30.48+17.23) ]
4=-30.28   [1(-18.01+12.69) + 3(-11.01+2.69)]
8=-1106.4  [...]

因此我需要一个脚本来读取所有具有相同索引条目的行。

我是一名AWK新手,几天前我开始学习这门语言。我现在不确定我是否能够实现我想要的目标。因此:

  1. 这可以用AWK吗?
  2. 如果没有,那是什么? SED?
  3. 如果是,怎么样?如果有人提供了一个描述如何实现这一目标的链接,我将不胜感激。
  4. 最后,我知道有一个类似的问题:Can awk patterns match multiple lines?但是,我没有一个将数据分开的常量模式。

    谢谢!

3 个答案:

答案 0 :(得分:3)

awk 'id!=$1{if(id){print id"="sum;sum=0};id=$1}{sum+=$2*($3+$4)} END{print id"="sum}' file
3=-185.5
4=-30.28
8=-1133.4
9=43.36
10=-67.2

答案 1 :(得分:3)

你可以试试这个:

number

对于每个线输入,我们进行所需的计算并将结果汇​​总到一个数组中。 awk '{ar[$1]+=$2*($3+$4)} END{for (key in ar) {print key"="ar[key]}}' inputFile 用作数组的键 读取整个文件后,我们会在$1 - 块中打印结果。

给定样本输入的输出为:

END{...}

如果需要对输出进行排序,您可能需要查看gawk的4=-30.28 8=-1133.4 9=43.36 10=-67.2 3=-185.5 函数或Linux“asorti - 命令(例如sort)。

此解决方案不要求输入已排序。

答案 2 :(得分:1)

另一个类似的awk

$ awk -v OFS="=" 'NR==1{p=$1}
                  p!=$1{print p,s; s=0; p=$1}
                       {s+=$2*($3+$4)}
                    END{print p,s}' file

3=-185.5
4=-30.28
8=-1133.4
9=43.36
10=-67.2

PS。您对“8”的计算似乎已关闭。