2013-02-14 6 views
-1

내가 도움이 필요 일치 필드에 기초하여 파일에 연속 2 개 라인을 병합 :awk | 다음으로

입력 파일 :

abc message=sent session:111,x,y,z 
pqr message=receive session:111,4,5,7 
abc message=sent session:123,x,y,z 
pqr message=receive session:123,4,5,7 
abc message=sent session:342,x,y,z 
abc message=receive session:311,x,y,z 
abc message=sent session:589,x,y,z 
pqr message=receive session:589,4,5,7 

출력 파일 :

abc message=sent session:111,x,y,z, pqr message=receive session:111,4,5,7 
abc message=sent session:123,x,y,z, pqr message=receive session:123,4,5,7 
abc message=sent session:342,x,y,z, NOMATCH 
abc message=sent session:589,x,y,z, pqr message=receive session:589,4,5,7 

주 :

소스 파일에 표시되는 경우 모든 "보낸"메시지에 대해 "수신"
모든 "보낸"에 대해 f 또는 "= 수신"을 즉시 NEXT LINE ONLY 동일한 세션 번호
그래서 우리는 세션 번호가 일치하는 곳에서 보내고받는 것을 병합합니다. ELSE는 순서대로 전송됩니다.
세션 = 342 있음 아니,
세션이 알 수없는 것입니다받지

+0

중복 가능성 | 필드 일치를 기준으로 라인을 병합] (http://stackoverflow.com/questions/14847251/awk-merge-line-on-the-basis-of-field-matching) – Vijay

+1

왜 같은 질문을 여러 번 묻는거야 당신이 이전에받은 질문을 받아 들인 후에도 시간이 걸립니다. – Vijay

+0

내가 틀린 말을 다시하면 죄송합니다. 그러나 이것은 이전 것과 약간 다릅니다 .. 여기서 나는 일치 된 논리와 그 수신을 즉시 다음 줄에 가져오고 싶습니다. –

답변

0
awk 
'{ 
split($3,a,","); 
if($2~/sent/) 
{ 
    if(prev!~/receive/ && NR!=1) 
    print prev,"NO MATCH";prev=$0;session=a[1]; 
} 
if($2~/receive/&&session==a[1]) 
{ 
    print session, prev,$0;prev=$0 
} 
}' temp 

테스트 하드 코딩 할 수 없습니다

> cat temp 
abc message=sent session:111,x,y,z 
pqr message=receive session:111,4,5,7 
abc message=sent session:123,x,y,z 
pqr message=receive session:123,4,5,7 
abc message=sent session:342,x,y,z 
abc message=sent session:589,x,y,z 
pqr message=receive session:589,4,5,7 

> awk '{split($3,a,",");if($2~/sent/){if(prev!~/receive/&& NR!=1)print prev,"NO MATCH";prev=$0;session=a[1];}if($2~/receive/&&session==a[1]){print session, prev,$0;prev=$0}}' temp 
session:111 abc message=sent session:111,x,y,z pqr message=receive session:111,4,5,7 
session:123 abc message=sent session:123,x,y,z pqr message=receive session:123,4,5,7 
abc message=sent session:342,x,y,z NO MATCH 
session:589 abc message=sent session:589,x,y,z pqr message=receive session:589,4,5,7 
> 

또는 당신은 단순히 벨로 같은 파일의 코드를 넣을 수 있습니다 w :

> cat tmp.awk 
#!/usr/bin/awk 

{ 
split($3,a,","); 
if($2~/sent/) 
{ 
    if(prev!~/receive/ && NR!=1) 
    print prev,"NO MATCH";prev=$0;session=a[1]; 
} 
if($2~/receive/&&session==a[1]) 
{ 
    print session, prev,$0;prev=$0 
} 
} 
> 

아래와 같이 실행한다

> awk -f tmp.awk temp 
session:111 abc message=sent session:111,x,y,z pqr message=receive session:111,4,5,7 
session:123 abc message=sent session:123,x,y,z pqr message=receive session:123,4,5,7 
abc message=sent session:342,x,y,z NO MATCH 
session:589 abc message=sent session:589,x,y,z pqr message=receive session:589,4,5,7 
> 
[AWK의
+0

감사합니다 Sarathi .. 내가이 코드를 .. 괜찮 았어 ..하지만 만약 우리가 그것에 대한 다음과 일치하는 그 라인을 건너 뛰는 아니 인쇄로 그것을 보내고 하나의 라인을 추가 (예 : 고양이 temp = abc 메시지 = 전송 된 세션 : 111, x, y, z pqr message = 수신 세션 : 111,4,5,7 abc 메시지 = 전송 된 세션 : 123, x, y, z pqr message = 수신 세션 : 123, 4,5,7 abc 메시지 = 보낸 세션 : 342, x, y, z abc 메시지 = 보낸 세션 : 589, x, y, z pqr message = 수신 세션 : 589,4,5,7 aaa 메시지 = 보낸 세션 : 555,1, a, 1 555 세션으로 마지막 줄을 건너 뜁니다. –