awk:在不改变NR的情况下查看下几行

时间:2015-11-24 20:06:53

标签: awk

我有这样的输入:

touchDown(9, 296, 413);
usleep(49699.75);
touchUp(9, 295, 413);
usleep(880305.71);

touchDown(9, 282, 397);
touchDown(10, 310, 536);
usleep(66298.79);
touchUp(9, 283, 402);
touchUp(10, 312, 538);
usleep(1300114.83);

touchDown(2, 313, 634);
touchDown(3, 257, 341);
touchDown(11, 349, 474);
touchMove(3, 69, 637);
usleep(16339.04);
touchMove(3, 34, 477);
usleep(49276.96);
touchUp(2, 311, 633);
touchUp(3, 253, 341);
touchUp(11, 344, 475);

现在我想要,例如。看看一个块(总是以/ touchDown /开头)是否有/ touchMove /其中的某个地方。如果是这样,请不要打印块或以某种方式编辑它。但awk逐行完成,一旦这些行被处理,似乎没有办法让几行回来。

我认为getline功能对我有帮助,但似乎它也增加了NR。我在这里找到的一些解决方案,将前一行放在一个变量中,这对于一行可能没问题,但是如果这样一个块通过很多行,那么它似乎非常不方便。

awk的这个“你不能回去”只会让我感到困惑......

你有什么解决方案吗?或者另一种语言对这样的事情更好吗?

谢谢

1 个答案:

答案 0 :(得分:2)

记录定义为空行,并且字段由单个换行符分隔,您可以使用以下awk命令:

awk '{for(i=1;i<=NF;i++){if($i~/^touchMove/){print;next}}}' FS='\n' RS='\n\n'

该命令检查每个字段是否以 touchMove 开头,并在这种情况下打印整个记录

这也可以简化为:

awk '/\ntouchMove/' FS='\n' RS='\n\n'

这意味着打印记录,如果它在换行符后包含术语'touchMove'

EtanReisner's comment之后,我们甚至可以将上述命令简化为:

awk '/\ntouchMove/' RS=''

自:

EtanReisner

  

RS =''将awk设置为“段落模式”,它也用空行分隔输入。它还会自动为FS使用换行符(除了FS设置的任何单个字符外)。所以FS ='\ n'RS ='\ n \ n'可以用RS =''

代替

https://www.gnu.org/software/gawk/manual/html_node/Multiple-Line.html

谢谢!