【发布时间】:2017-02-01 15:43:50
【问题描述】:
我正在处理 tshark 字段的一些输出。一些处理已经发生,现在有相邻的行,其中最后一个字段是重复的。这些重复项缺少具有匹配序列号的行。任务是只保留序列列匹配的相邻行对。最后一个字段的值是 0 和 130,每对行都以 130 开头。序列是一个 0-15 的数字。数据流包含许多行。 这些字段是:
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 连接,为清楚起见未显示。
【问题讨论】:
标签: awk duplicates