2017-01-30 55 views
0

我正在处理一些tshark字段的输出。一些处理已经发生,并且现在有相邻行的最后一个字段被复制。这些重复项缺少一个具有匹配序列号的行。任务是仅保留序列列匹配的相邻行对。最后一个字段的值为0和130,每对行以130开头。序列号是0-15。数据流包含很多行。 的字段为:awk根据重复字段保留相邻行

date  time     src-int dst-int seq  function 
24/01/2017 16:57:27.307400000 10  1000 11  130 
24/01/2017 16:57:27.418675000 1000 10  11  0 
24/01/2017 16:58:53.603604000 1000 10  12  0 
24/01/2017 16:58:54.121603000 10  1000 13  130 
24/01/2017 16:58:54.677752000 10  1000 14  130 
24/01/2017 16:58:54.681079000 1000 10  14  0 
24/01/2017 17:09:12.974979000 10  1000 1  130 
24/01/2017 17:09:12.981149000 1000 10  1  0 
24/01/2017 17:09:13.477211000 1000 10  2  0 
24/01/2017 17:09:14.026279000 1000 10  3  0 

所需的输出是保持对行的与功能130顺序然后0和匹配序列号:

24/01/2017 16:57:27.307400000 10  1000 11  130 
24/01/2017 16:57:27.418675000 1000 10  11  0 
24/01/2017 16:58:54.677752000 10  1000 14  130 
24/01/2017 16:58:54.681079000 1000 10  14  0 
24/01/2017 17:09:12.974979000 10  1000 1  130 
24/01/2017 17:09:12.981149000 1000 10  1  0 

我有一个解决方案,半作品。它匹配\t130$并获取下一行,如果序列匹配则打印。它返回的是良好的数据,但是它不处理重复的值130.在示例数据中,它省略了序列14.相邻重复行的数量是任意的,因此嵌套另一个测试似乎很愚蠢。

awk "/\t130$/ {seq=$5; prev=$0; getline;} $5==seq {print prev; print;}" 

如何最好地处理所有重复的开始条件?

顺便说一句,在Windows 7中使用GNU awk。 FWIW两行最终将使用print prev,$0连接起来,为了清楚起见未显示。

回答

0
$ awk 'p==$5 && q==130 && $6==0 {print b $0} {p=$5; q=$6; b=$0 "\n"}' file 
24/01/2017 16:57:27.307400000 10  1000 11  130 
24/01/2017 16:57:27.418675000 1000 10  11  0 
24/01/2017 16:58:54.677752000 10  1000 14  130 
24/01/2017 16:58:54.681079000 1000 10  14  0 
24/01/2017 17:09:12.974979000 10  1000 1  130 
24/01/2017 17:09:12.981149000 1000 10  1  0 
  • p是以前$5,应该是相同的电流$5
  • q是以前$6,应该是130
  • b缓冲器先前$0\n附加到是漂亮的print
+1

谢谢。关于流程,我相信第二个{{action}'总是被执行,因为它没有条件?在这种情况下为什么清楚b?此外,任何追加行结束的原因而不是使用两个打印语句? – gloopy

+0

1. Sl。。 2.非特定。 –

+0

此答案强制匹配必须位于相邻行中。标记为正确,因为它是最准确的解决问题的方法。 – gloopy

1
awk 'NR==1 { print; next } 
    $6 == 0 && $5 == seq && c == 0 { print row; print; c++ } 
    $6 == 130 { seq=$5; row=$0; c=0 } 
' file 
date  time     src-int dst-int seq  function 
24/01/2017 16:57:27.307400000 10  1000 11  130 
24/01/2017 16:57:27.418675000 1000 10  11  0 
24/01/2017 16:58:54.677752000 10  1000 14  130 
24/01/2017 16:58:54.681079000 1000 10  14  0 
24/01/2017 17:09:12.974979000 10  1000 1  130 
24/01/2017 17:09:12.981149000 1000 10  1  0 
+0

谢谢,我喜欢它,并很容易修改,以连接rows.What是什么目的'NR == 1 {print;下一个}?在给定的输入上使用这种解决方案导致在seq 11函数0中省略该行。如果我删除NR == 1部分,它可以正常工作。 – gloopy

+0

@gloopy NR == 1部分仅用于打印标题。你可以删除,如果不需要 – mug896

+0

啊。标题行仅提供问题描述:) – gloopy