我有这样的输入:
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的这个“你不能回去”只会让我感到困惑......
你有什么解决方案吗?或者另一种语言对这样的事情更好吗?
谢谢
答案 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
谢谢!