使用awk以当前行值处理下一列值

时间:2016-11-10 21:56:03

标签: perl shell awk sed

我是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。

2 个答案:

答案 0 :(得分: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

另请注意,您不需要捕获文件并将其传递到awk,它接受​​一个文件作为最后一个参数。

答案 1 :(得分:0)

试试这个awk命令:

bob

<强>输出

name:

<强>解释

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