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可行吗
  • 如果没有,那是什么?塞德
  • 如果是,如何进行?如果您能提供一个链接,描述如何实现这一点,我将不胜感激
  • 最后,我知道有一个类似的问题:,但是,我没有一个固定的模式来分隔我的数据

    谢谢

    您可以尝试以下方法:

    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}”是的,感谢您的注意。手工计算技能似乎正在逐渐消失。是的,谢谢你的注意。看来手工计算技能正在逐渐消失。谢谢!这正是我想知道的。谢谢!这正是我想知道的。