2014-06-17 2 views
1

awk를 사용하여 공백으로 구분 된 입력 텍스트 파일을 구문 분석하려고합니다. 열 코드는 각 그룹에 대해 둘 이상의 행을 가질 수 있습니다. 나는 이것에 어떤 도움을 주셔서 감사합니다.awk를 사용하여 큰 테스트 파일을 구문 분석합니다.

입력 파일 :

TR 1 
Action 

Success/Failure 
8.1.1.1 RunOne 80 48 
8.1.1.2 RunTwo 80 49 
8.1.1.3 RunThree 100 100 
8.1.1.4 RunFour 20 19 
8.1.1.5 RunFive 20 20 
Action Time 16:47:42 
Action2 

Success/Failure 
8.1.2.1 RunSix 80 49 
8.1.2.2 RunSeven 80 80 
8.1.2.3 RunEight 80 80 
Action2 Time 03:26:31 

TR 2  
Action 

Success/Failure 
8.1.1.1 RunOne 80 48 
8.1.1.2 RunTwo 80 49 
8.1.1.3 RunThree 100 100 
8.1.1.4 RunFour 20 19 
8.1.1.5 RunFive 20 20 
Action Time 16:47:42 
Action2 

Success/Failure 
8.1.2.1 RunSix 80 49 
8.1.2.2 RunSeven 80 80 
8.1.2.3 RunEight 80 80 
Action2 Time 03:26:31 

원하는 출력 파일

------------------ 
s.no Runno Runname val1 val2 %val1&val2 
1. 8.1.1.1 Runone 160 96 %  #val1 and Val2 should display as sum of TR1&TR2 
2. 8.1.1.2 Runtwo 160 98 
3. 8.1.1.3 Runthree 200 200 
4. 8.1.1.4 RunFour 40 38 
....... 

및 각 TR 1 (을 TestRun)에서 각 Runname의 발생

코드는 아래의 어떤을 찾을

#!/usr/bin/awk -f 

BEGIN { 
    # You can customize this to change your output layout based on your preference. 
    format = "%-10s%-7s%-5s%-8s\n” 
    printf format, “Runno”, “Runname”, “Val1”, “Val2” 
} 
++i==2{ 
    l = $1 
} 
i>100{ 
    if (/^[[:blank:]]*$/) { 
     i = 0 
    } else if (NF > 1) { 
     printf format, l, $1, $2, $3, $4, $5 
     p1=$1; p2=$2; p3=$3; p5=$5 
    } else { 

     printf format, l, p1, p2, p3, $1, p5 
    } 
} 
+0

무엇을하려하십니까? 원하는 입력에 도달하기위한 요구 사항은 무엇입니까? 8.1.1.X 만있는 이유는 무엇입니까? –

+0

안녕하세요, 이것은 테스트 중 하나에 대한 출력 파일입니다. 파일에는 다른 반복 (TR 1과 TR 2 ...)이 있습니다. 파일을 구문 분석하고 각 반복에 대한 Runno, Runname의 총 수를 표시해야합니다. Runno는 각 반복마다 여러 번 반복 될 수 있습니다. Runno 8.1.1.X에서만 시작됩니다. 위에서 설명한 것처럼 파일을 분할/구문 분석하고 표 형식의 열로 표시해야합니다. – user3745740

+0

에코 "번호 입력 :" n1 awk '/^$/{ca = ""; cp = ""}/^ #/{ca = ca ""$ 0}/^ $ n1/&& ca {cp = ca; 입력에서 값을 얻는 방법을 제안하십시오. – user3745740

답변

1

이것은 출발점을 줄 수 있습니다. 참고 : 출력이 정렬되지 않고 출력에서 ​​헤더와 첫 번째 열이 누락되었습니다. 그러나 나는 그 값을 남깁니다. /^8\./ 함께

awk '/^8\./ { a[$1 " " $2] += $3 ; b[$1 " " $2] += $4 } 
    END { for (k in a) { 
      printf("%s %i %i\n",k,a[k],b[k]) 
     } 
    }' INPUTFILE 
  1. 는 해당 라인 저장소 해당 라인
  2. a[$1 " " $2] += $3 ; b[$1 " " $2] += $4에서만 작동하고 세 번째 및 네 번째 열의
  3. 최종적 a 배열을 반복하여 해당 데이터를 인쇄 얻을 증분 b 배열의 데이터도 마찬가지입니다.
+1

첫 줄에 '1'과 '2'가 필요하지 않습니다. –

+0

@Jidder, 당신 물론 맞습니다. 나는 이전 버전을 복사했다 :-) –

+1

@ Zsolt Botykai l을 k로 변경하면 나는 그것을 완료했다고 생각한다. –

관련 문제