Regex AWK:模式匹配具有可变行号的多行数据
我正在尝试编写一个脚本来分析管道中的数据。问题是,单个元素的描述行数可变。查看示例数据集:Regex AWK:模式匹配具有可变行号的多行数据,regex,linux,awk,multiline,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 在本例中,
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))
其中,i将接管属于给定元素的所有行。我想要生成的输出将如下所示:
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新手,几天前开始学习这门语言。我现在不确定我是否能够实现我想要的。因此:
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
awk '{ar[$1]+=$2*($3+$4)}
END{for (key in ar)
{print key"="ar[key]}}' inputFile
对于每一行输入,我们进行所需的计算,并将结果汇总到一个数组中<代码>$1用作数组的键。当读取整个文件时,我们在
END{…}
-块中打印结果
给定样本输入的输出为:
4=-30.28
8=-1133.4
9=43.36
10=-67.2
3=-185.5
如果需要对输出进行排序,您可能需要查看gawk的asorti
函数或Linux的sort
-命令(例如awk'{…}inputFile'| sort-n
)
此解决方案不需要对输入进行排序。您可以尝试以下方法:
awk '{ar[$1]+=$2*($3+$4)}
END{for (key in ar)
{print key"="ar[key]}}' inputFile
对于每一行输入,我们进行所需的计算,并将结果汇总到一个数组中<代码>$1用作数组的键。当读取整个文件时,我们在
END{…}
-块中打印结果
给定样本输入的输出为:
4=-30.28
8=-1133.4
9=43.36
10=-67.2
3=-185.5
如果需要对输出进行排序,您可能需要查看gawk的asorti
函数或Linux的sort
-命令(例如awk'{…}inputFile'| sort-n
)
此解决方案不需要对输入进行排序。还有另一个类似的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
注:你对“8”的计算似乎不正确。还有一个类似的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
注:您对“8”的计算似乎不正确。在awk中完全可行,甚至不用在sed中尝试:)所需的输出是什么?例如,我引用的总和和索引号(第一列)这在awk中是完全可行的,甚至不用在sed中尝试:)所需的输出是什么?例如,我引用的和和和索引号(第一列)您确定“id”永远不能为零吗?
id
保证不提供的其他数字有哪些?测试if(id!=“”)
或更清晰的if(NR>1)
,而不是if(id)
,并将id=$1
移出仅在id!时执行的操作块=$1
并进入总和+=…
块。谢谢@EdMorton<代码>awk'id=$1&&NR>1{print id”=“sum;sum=0}{id=$1;sum+=$2*($3+$4)}END{print id”=“sum}”您确定“id”永远不能为零吗?id
保证不提供的其他数字有哪些?测试if(id!=“”)
或更清晰的if(NR>1)
,而不是if(id)
,并将id=$1
移出仅在id!时执行的操作块=$1
并进入总和+=…
块。谢谢@EdMorton<代码>awk'id=$1&&NR>1{print id”=“sum;sum=0}{id=$1;sum+=$2*($3+$4)}END{print id”=“sum}”是的,感谢您的注意。手工计算技能似乎正在逐渐消失。是的,谢谢你的注意。看来手工计算技能正在逐渐消失。谢谢!这正是我想知道的。谢谢!这正是我想知道的。