2017-01-30 52 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