2017-01-30 2 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;}" 

시작 조건에서 모든 중복을 처리하는 가장 좋은 방법은 무엇입니까?

BTW, 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? 또한 두 개의 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

관련 문제