高级使用awk

时间:2013-11-08 02:35:26

标签: awk

假设您有这样的文件:

Rowname  
useless number  
useless number  
1596 1787  
1595 1787  
1594 1787  
1565 1803  
1565 1804  

我知道如何告诉awk根据useless number跳过Rowname和awk第5行和第6行。但是,如果差异只是前一行的1,我如何告诉awk跳过该行?输出应为:

1596 1787  
1565 1803

我的问题是在某些情况下我得到了这个:

1595 1787  
1594 1787

另一种说法:我总是希望行名称中的第3行,但如果第3行与第3行的区别仅为1(或2或3),我不希望第4行(或5或6)。

这有意义吗?

2 个答案:

答案 0 :(得分:1)

如果您想要打印“Rowname”,这似乎符合您的要求;如果没有,请省略脚本第一行中的print

$     awk '/^Rowname/         { nr=NR; print; next }
>          NR==nr+1||NR==nr+2 { next }
>          NR==nr+3           { v1=$1; print; next }
>                             { if (abs(v1-$1) > 1) print; v1=$1; }
>          function abs(x)    { return (x < 0) ? -x : x }
>         ' data
Rowname
1596 1787
1565 1803
$

答案 1 :(得分:0)

这个可以做到

awk '#print line 4
     NR == 4;
     #print any line that meets the "sum" comparison condition
     NR > 4 && ($1 + $2 - prev_sum != -1) && ($1 + $2 - prev_sum != 1);
     #set the sum for this line into a variable
    {prev_sum=$1 + $2}' file.txt