【问题标题】:using awk to process next column values with current line value使用 awk 处理具有当前行值的下一列值
【发布时间】:2017-03-25 01:50:01
【问题描述】:

我是 awk 的新手,不知道如何处理下一个记录列,我们将不胜感激。 必填:

$ cat sample.csv
1,1,1,30,40,23,24,25,26,27,28,29,0,0,0,0,0,0,0,0
1,2,1,35,40,33,34,35,36,37,38,39,12,13,14,15,16,17,22,36
1,3,1,45,50,43,44,45,46,47,48,49,22,23,24,25,26,27,33,38

我能够获得所需的一半,在第 1 行,我无法处理第 2 行的值

$ cat sample.csv | awk -F"," '{a+=$4}{b+=$5}{c+=$6}{d+=$7}{e+=$8}{f+=$9}{g+=$10}{h+=$11}{i+=$12}{j+=$13}{k+=$14}{l+=$15}{m+=$16}{n+=$17}{o+=$18}{p+=$19}END{print "Line 1 " a+b-c-d-e-f-g-h}'

第 1 行 -399

我正在寻找表达式a+b-c-d-e-f-g-h - (NextRecord i+j+k+l+m+n) 对于最后一条记录,我们可以将下一条记录的值视为 0。

【问题讨论】:

  • 预期输出是什么?

标签: perl shell awk sed


【解决方案1】:

我认为 END 块把你搞砸了。我对awk 的有限了解包括它与perl 隐约相似,并且至少在perl 中END 在进程的最后运行。因此,您只会得到一行,因为您告诉该代码块在整个过程执行完成之前不要运行。

awk -F"," '{a+=$4}{b+=$5}{c+=$6}{d+=$7}{e+=$8}{f+=$9}{g+=$10}{h+=$11}{i+=$12}{j+=$13}{k+=$14}{l+=$15}{m+=$16}{n+=$17}{o+=$18}{p+=$19} {print "Line 1 " a+b-c-d-e-f-g-h}' sample.csv

另外请注意,您不需要 cat 文件并将其通过管道传送到 awk,它接受文件作为最后一个参数。

【讨论】:

    【解决方案2】:

    试试这个 awk 命令:

    awk -F, 'NR!=1{print "Line", NR-1, (l-$12-$13-$14-$15-$16-$17)} {l=($4+$5-$6-$7-$8-$9-$10-$11)}  END {print "Line", NR, l} ' /tmp/sample.csv
    

    输出

    Line 1 -192
    Line 2 -307
    Line 3 -178
    

    说明

    awk -F, '
     NR != 1 {                        # Skip first record
       print "Line", NR-1, \          # Print the output using the data from 
         (l-$12-$13-$14-$15-$16-$17)  # the last record
     }
     {l=($4+$5-$6-$7-$8-$9-$10-$11)}  # Store this for later
     END {print "Line", NR, l}        # Specific case for last record
    ' /tmp/sample.csv                 # filename
    

    【讨论】:

    • 谢谢杰!.. 这是完美的解决方案,我一直在寻找。
    猜你喜欢
    • 2016-07-19
    • 2016-07-20
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    • 2022-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多