2010-04-12 5 views
0

데이터베이스에서 내 보낸 텍스트 파일에 필드가 있습니다. 이 필드에는 주소가 포함되어 있지만 때로는 꽤 길기 때문에 데이터베이스에서 여러 줄을 포함 할 수 있습니다. 내보낼 때, 개행 문자는이 같은 달러 기호로 대체됩니다 :필드의 요소를 효율적으로 분할

first part of very long address$second part of very long address$third part of very long address 

아니 모든 주소는 여러 라인을 가지고 있으며, 어떤 주소는 세 개 이상의 라인을 포함하지 않는다. 각 줄의 길이는 가변적입니다.

나는 우편물에 사용되는 MS Access로 가져 오기 위해 데이터를 마사지하고 있습니다. $ sign에 필드를 분할하고 싶지만 필드에 1 행만 들어있는 경우 두 개의 여분의 출력 필드를 길이가 0 인 문자열로 설정하여 주소에 빈 줄이 생기지 않도록하고 싶습니다. 인쇄 될 때.

텍스트 파일의 다른 모든 데이터에서 올바르게 작동하는 awk 파일이 있는데이 마지막 비트가 작동해야합니다. 나는 아래의 코드를 시도했다. else에서 구문 오류가 발생하는 것을 제외하고 이것이 내가 원하는 것을 수행하는 좋은 방법이라고 확신하지 못합니다. 이 작업은 Windows에서 gawk로 수행됩니다.

BEGIN { FS = "|" } 
$1 != "HEADER" { 
    if ($6 ~ /\$/) 
     split($6, arr, "$") 
     address = arr[1] 
     addresstwo = arr[2] 
     addressthree = arr[3] 
     addressLength = length(address) 
     addressTwoLength = length(addresstwo) 
     addressThreeLength = length(addressthree) 

    else { 
     address = $6 
     addressLength = length($6) 
     addresstwo = "" 
     addressTwoLength = length(addresstwo) 
    addressthree = "" 
     addressThreeLength = length(addressthree) 
     } 

    printf("%*s\t%*s\t\%*s\n", 
      addressLength, address, addressTwoLength, addresstwo, addressThreeLength, addressthree) 
} 

편집 : 죄송합니다. 여기에 샘플이 있습니다

HEADER|0000000130|0000527350|0000171250|0000058000|0000756600|0000814753|0000819455|100106 
rec1|ILL/COLORADO COLLEGE$TUTT LIBRARY|1021 N CASCADE$COLORADO SPRINGS, CO 80903| 
rec2|ILL /PIKES PEAK LIBRARY DISTRICT|20 N. CASCADE AVE./PO BOX 1579$COLORADO SPRINGS, CO 80903| 
rec3|DOE,JOHN|PO Box 8034| 
rec4|ILL/GEORGIA INSTITUTE OF TECHNOLOGY|INFORMATION DELIVERY DEPT$704 CHERRY ST$ATLANTA, GA 30332-0900 

헤더가없는 행과 만 일치합니다. $ 기호에 텍스트 문자열을 분할해야합니다. 파이프 사이의 문자열을 패딩해서는 안됩니다 (그래서 원래 코드에서 길이를 가져 오려고했습니다). 이 예에서는 6 개의 출력 필드가 있고 데이터가없는 필드는 단순히 빈 문자열뿐입니다 (코드에서 수행하려고했던 것).

rec1|ILL/COLORADO COLLEGE|TUTT LIBRARY|1021 N CASCADE|COLORADO SPRINGS, CO 80903|| 
rec2|ILL /PIKES PEAK LIBRARY DISTRICT||20 N. CASCADE AVE./PO BOX 1579|COLORADO SPRINGS, CO 80903|| 
rec3|DOE,JOHN||PO Box 8034||| 
rec4|ILL/GEORGIA INSTITUTE OF TECHNOLOGY||INFORMATION DELIVERY DEPT|704 CHERRY ST|ATLANTA, GA 30332-0900| 

희망 하시겠습니까? 아직도 명확하지 않은 경우 알려주십시오.

+0

입력 데이터의 명확한 예를 보여주고 원하는 출력을 표시하는 것이 좋습니다. – ghostdog74

답변

0
BEGIN { FS = "|" } 
$1 != "HEADER" { 
    for(i = gsub(/\$/, "\t", $6); i < 3; i++) 
     $6 = $6 "\t" 
    print $6 
} 

나는 귀하의 요구 사항을 제대로 알고 있는지 잘 모르겠습니다.

관련 문제