2014-11-29 1 views
0

필드가 특수 기호로 구분 된 EVA 바이너리 데이터베이스에서 데이터를 가져 오려고합니다. 지금까지 날짜를 XML 형식의 다음 형식의 텍스트 파일로 변환했습니다. 필드의 순서가 어떻게 다른지, 모든 필드가 필수는 아닌지 주목하십시오.EVA 형식의 데이터 구문 분석

<251>id1<230><223>author1<228><215>title1<223><230>year1<225><232>location1<226> 
<251>id2<230><223>author2<228><230>year2<225><232>location2<226><215>title2<223> 
<251>id3<230><230>year2<225><232>location2<226><215>title2<223> 

각 행은 별도의 항목, 그리고 그들 각각에 대해 나는 등

251=id1 
223=author1 

지금 내가 데이터를 분석하기 위해 고군분투 같은 것을 좀하고 싶습니다. 나는 보통 explode 함수를 사용하고 구분 기호를 정의하지만, 특정 부분 문자열이 속한 필드에 대한 정보를 잃어 버리기 때문에 여기서는 할 수 없습니다.

어쩌면 내가 CSV 파일을 생성하려고합니다. 어쩌면 거기에 텍스트 파일을 직접 구문 분석하여 각 데이터를 구문 분석하는 중복 프로세스를 건너 뛰는 방법이있을 수 있습니다. 체재.

+0

두 번째 숫자는 무엇입니까? –

+0

두 번째 숫자는 중복됩니다. 블록이 닫혔다는 것을 알리는 것뿐입니다. –

답변

2

좋아요?

$ cat tst.awk 
BEGIN { 
    FS="[<>]+" 
    OFS="=" 
} 
{ 
    for (i=2;i<NF;i+=3) { 
     print $i, $(i+1) 
    } 
    print "" 
} 
$ awk -f tst.awk file 
251=id1 
223=author1 
215=title1 
230=year1 
232=location1 

251=id2 
223=author2 
230=year2 
232=location2 
215=title2 

251=id3 
230=year2 
232=location2 
215=title2 

질문을 다시 읽은 후이 당신이 정말로 원하는 것을 아마 가까운 : 당신은 당신이 게시 입력 주어진할까요 실제 출력을 보여 질문을 업데이트하지 않으면

$ cat tst.awk 
BEGIN { FS="[<>]+"; OFS="," } 

{ 
    for (i=2;i<NF;i+=3) { 
     if (!seenName[$i]++) { 
      names[++numNames] = $i 
     } 
     n2v[NR,$i] = $(i+1) 
    } 
} 

END { 
    for (nameNr=1; nameNr<=numNames; nameNr++) { 
     printf "%s%s", names[nameNr], (nameNr<numNames?OFS:ORS) 
    } 

    for (recNr=1; recNr<=NR; recNr++) { 
     for (nameNr=1; nameNr<=numNames; nameNr++) { 
      name = names[nameNr] 
      printf "%s%s", n2v[recNr,name], (nameNr<numNames?OFS:ORS) 
     } 
    } 
} 
$ 
$ awk -f tst.awk file 
251,223,215,230,232 
id1,author1,title1,year1,location1 
id2,author2,title2,year2,location2 
id3,,title2,year2,location2 

.