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

Iは、溶液の半分の動作を有しています。 \t130$と一致し、次の行を取得し、シーケンスが一致した場合に出力します。それは良いデータを返しますが、重複する値130を処理しません。この例のデータでは、シーケンス14は省略されています。隣接する重複する行の数は任意ですので、別のテストをネストするのは馬鹿です。

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

開始条件のすべての重複を処理するにはどうすればよいですか?

Windows 7でGNU awkを使用しています。 FWIW 2行は、わかりやすくするために、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
  • qと同じでなければならないことは130
  • b$0をバッファし\nがISに追加されなければならない、前$6であり、前$5あります可愛い人のためにprint
+1

ありがとうございます。フローに関しては、第2の '{action}'は条件がないので常に実行されると思いますか?どのような場合に、なぜクリアb?また、2つのprint文を使うのではなく、行末を追加する理由は何ですか? – gloopy

+0

1.気晴らし。 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

ありがとう、私はそれが好きで、行を連結するように簡単に修正しました。 'NR == 1 {print;次へ} '?与えられた入力に対してこの解法を使用すると、seq 11関数0の行が省略されます.NR == 1セクションを削除すると正常に動作します。 – gloopy

+0

@gloopy NR == 1部はタイトルを印刷するためのものです。必要ない場合は削除することができます – mug896

+0

aah。問題の説明のためにのみ提供されたヘッダー行:) – gloopy

関連する問題