awk-跨ascii文件行的计算

awk-跨ascii文件行的计算,awk,Awk,我有一个ascii文件,其结构如下: 1,0,4,0,0,0,0,0,0,0,0 1,0,4,0,0,0,0,0,0,0,0 1,0,4,0,0,0,0,0,0,0,0 1,0,3,0,0,0,0.04,0,0,990,0 1,0,3,0,0,0,0.12,0,0,3760,0 1,0,3,0,0,0,0.21,0,0,5372,0 1,0,4,0,0,0,0,0,0,0,0 1,0,4,0,0,0,0,0,0,0,0 1,0,4,0,0,0,0,0,0,0,0 1,0,4,0,0,0,0,0,

我有一个ascii文件,其结构如下:

1,0,4,0,0,0,0,0,0,0,0
1,0,4,0,0,0,0,0,0,0,0
1,0,4,0,0,0,0,0,0,0,0
1,0,3,0,0,0,0.04,0,0,990,0
1,0,3,0,0,0,0.12,0,0,3760,0
1,0,3,0,0,0,0.21,0,0,5372,0
1,0,4,0,0,0,0,0,0,0,0
1,0,4,0,0,0,0,0,0,0,0
1,0,4,0,0,0,0,0,0,0,0
1,0,4,0,0,0,0,0,0,0,0
1,0,4,0,0,0,0,0,0,0,0
1,0,4,0,0,0,0,0,0,0,0
.
.
.
零代表我不需要注意的“随机”数字

其中第3列等于3(总是一个三块),我有 要使用第7列和第10列执行某些计算,请执行以下操作:

我需要计算(0.04*990)+(0.12*3760)+(0.21*5372) 并将结果插入所有三行的第5列。 第10列中的值将在下一个“三块”中有所不同

以前我用awk做过很多ascii文件编辑,所以如果可能的话,我也想在这里使用它

我的主要问题是在找到列3=3后访问接下来的两行,然后继续进一步搜索两行


结果应该如下所示:

1,0,4,0,0,0,0,0,0,0,0
1,0,4,0,0,0,0,0,0,0,0
1,0,4,0,0,0,0,0,0,0,0
1,0,3,0,1618.92,0,0.04,0,0,990,0
1,0,3,0,1618.92,0,0.12,0,0,3760,0
1,0,3,0,1618.92,0,0.21,0,0,5372,0
1,0,4,0,0,0,0,0,0,0,0
1,0,4,0,0,0,0,0,0,0,0
1,0,4,0,0,0,0,0,0,0,0
1,0,4,0,0,0,0,0,0,0,0
1,0,4,0,0,0,0,0,0,0,0
1,0,4,0,0,0,0,0,0,0,0
.
.
.
我希望我能够描述问题,如果不只是问,我会澄清


我试过:

awk -F"," '$3 == "3"' in.dat > out.dat
并将其与

awk -v "n=line numer" -v "s=string to insert" '(NR==n) { print s } 1' input-file
但我的主要问题是,我不知道如何访问第一行之后的字段,并在计算公式中使用它


我真正需要使用的公式要复杂得多,但我在这里只发布了一个简单的示例,因为将其应用于更复杂的解决方案是没有问题的。

在awk中

awk -F, '$3=="3"{a[++x]=$0;y+=($7*$10)}
         !x
         x==3{
            while(++i<=x){
                    split(a[i],b,",")
                    b[5]=y
                    for(j=1;j<length(b);j++)
                            c=j>1?c","b[j]:b[j]
                            print c
                            c=t
            }
            x=y=i=0
    }' file

awk的
getline
命令在这里为您提供了很好的服务

awk -F, -v OFS=, '
    $3 == 3 {
        c = 0
        line1 = $0; c += $7 * $10; getline
        line2 = $0; c += $7 * $10; getline
        line3 = $0; c += $7 * $10
        $0 = line1; $5 = c; print
        $0 = line2; $5 = c; print
        $0 = line3; $5 = c
    }
    {print}
'
这对我的口味来说还不够干,但只有3行,可读性很强

干溶液

awk -F, -v OFS=, '
    $3 == 3 {
        c = 0
        for(i=1;i<=3;i++)
        {line[i] = $0; c += $7 * $10; getline}
        for(i=1;i<=3;i++)
        {$0 = line[i]; $5 = c; print}
        next
    }1
' 
awk-F,-v OFS=,'
$3 == 3 {
c=0

对于(i=1;iso,到目前为止你做了什么?你被困在哪里了?另外,因为它是一个固定值,为什么不按原样添加它,而不是每次都进行计算呢?我尝试了:awk-F“,“'$3==“3”'in.dat>out.dat,并将它与awk-v“n=line numer”-v“s=string组合以插入“'(NR==n){print s}1'输入文件,但我的主要问题是,我不知道如何访问第一行之后的字段,并在公式中使用它进行计算。我真正需要使用的公式要复杂得多,但我在这里只发布了一个简单的示例,因为将其适应更复杂的解决方案没有问题……第10列中的值不同在接下来的三个“街区”(对不起,我忘了提)很好,你提供了这样的信息,他们让问题变得更清楚。但是,这里的评论没有被人们注意到,所以你最好编辑你的问题并添加这些细节。另外,给已经回答的人提供反馈。最后,你可以看看这个页面:非常可读,我认为这些数据是不干燥的,你只能做这么多!;-)@glennjackman,我为烘干机解决方案添加了一个编辑,添加评论太长了,而且我不想在自己的答案中抄袭,如果你愿意,请随意删除:)我也喜欢你的解决方案,但我会选择glenn jackman的,因为它更容易适应我(更复杂)的公式。
awk -F, -v OFS=, '
    $3 == 3 {
        c = 0
        for(i=1;i<=3;i++)
        {line[i] = $0; c += $7 * $10; getline}
        for(i=1;i<=3;i++)
        {$0 = line[i]; $5 = c; print}
        next
    }1
'