2012-06-15 2 views
0

안녕하세요 내가 실제로 내용이 좋아있는 텍스트 파일을 가지고 놀아 awk 스크립트를 관리하기 위해 노력 실제로 등등AWK의 별도의 기록에 명령 및 CSV로 저장

. [135]Edwards Engineering Pty Ltd 
     Quality Structural Steel. Specialising In Fabrication And Steel 
     Stairs 
     21- 23 Ada Ave, Brookvale NSW 2100 
     ph: (02) 9938 5320 

. [269]Diavolo Steel Fabrication 
     5 Humeside Drv, Campbellfield VIC 3061 
     ph: (03) 9357 7947 


     . [40]WH Williams Pty Ltd 
     Your Partner For High Quality Custom-Made Metal Products 
     Short lead times & unbeatable quality. Make us the first choice for 
     your entire sheetmetal laser cutting,bending,welding & more. 
     61- 77 Egerton St, Silverwater NSW 2128 
     ph: (02) 9647 1277 
      [41]www.whwilliams.com.au 

와 .. 큰 파일을 다음과 같습니다. . 와 내가 작성하는 관리 스크립트는이 명령이 기록을 분리 .. 와 CSV 파일로 내 텍스트 파일을 변환하지만, 위입니다 예를 언급에 주소의 길이, 위에서 볼 수 있듯이

awk '$2 ~ /\. \[/{$1=x; print}' RS=\* FS='\n' OFS='|' Myfile > excel.csv 

입니다 변화하고 나는 CSV 파일을 얻고있다. 불규칙한 서식 전자 ..

그래서 내가 지금 무엇을 원하는 하나 개의 셀에 회사의 1.title을 넣어 명령을 변경하고, 2. 설명 부분은 경우는 하나의 셀과 나던 경우 존재 셀이 비어 있어야합니다. 3. 한 셀의 주소 부분 4. 한 셀의 전화 번호 5. 한 셀의 웹 사이트 특정 구성 요소가 존재하지 않으면 해당 셀은 공백으로 남겨 두어라.

나는 리눅스에 익숙하고, 껍질과 awk에 너무 익숙한 물건을 다뤄려고 노력하고있다. .. 그렇게 할 수 있으면 아무도 나를 도와 줄 수 없다. ..

답변

0

여러 행으로 구분 된 레코드 집합을 ~ 으로 구분 된 하나의 행으로 변환하는 논리를 사용했습니다. 그런 다음이 논리를 작성하여 csv 파일로 변환 할 수 있습니다 (아직 완료하지 않았습니다).)

cat ip_file.txt | tr '\n' '~' | tr '[' '\n' 

참고 : 못해, 나는이 여러 줄 필드 및 요구 사항 내 마음에 와서 아래에 대처해야 다소 복잡한 시나리오이다 인정해야 기록 사이

+0

nope buddy. .. 그것은 이미 내가 만든 형식을 망칠뿐입니다! –

+0

우리는 매치 (match) 기능을 사용하여 그것을 제거 할 수 있습니까? 나는 혼란스럽고 고생하고있다. .. 나 같은 멍청한 놈이 심각한 일을하기 시작하면 어떻게 될까? –

0

을 올 [가정 :

  • 각 필드는
  • 특별한 형식이 출력에 예상되는 여러 줄에 걸쳐있을 수는, 여기에 CSV 형식입니다, 일명 쉼표, CSV
  • 특정 필드 형식에 대한 일부 asumption에 대한 텍스트를
  • 탈출 문자를 구분 전화 번호 ph:로 시작 할 수 있으며, 주소 번호, 거리의 숫자로 시작할 수처럼 등 여기

는 참조 용 코드는 다음과 같습니다

#!/usr/bin/awk -f 
BEGIN{ 
    RS="\.\s* \[[0-9]+\]"; 
    FS="\n"; 
    OFS=","; 
} 

function find_next_field_until_regex(regex, i, result){ 
    result = ""; 
    for (; i < NF; i++){ 
     field = $i 
     sub(/,/, "\,", field); 
     sub(/^[ \t]*/, "", field); 
     if (field ~ regex){ 
      break; 
     } 
     result = result field; 
    } 
    printf("%s%s", result, OFS); 
    return i; 
} 

{ 
    if(NF>1){ 
     sub(/,/, "\,", $1); 
     printf("%s%s", $1, OFS); 
     i = 2; 
     i = find_next_field_until_regex("^[0-9]+", i); #discription 
     i = find_next_field_until_regex("^ph: ", i); #address 
     i = find_next_field_until_regex("www\\.", i); #phone 
     for (; i < NF; ++i){ 
      printf("%s", $i); 
     } 
    } 
    printf("\n"); 
} 

또한 gist snippet을 확인하십시오.

0
awk '$1 ~ /\. \[/ { 
sub(/\. \[[0-9]*]/, "", $1) 
if ($2 ~ /^ *[0-9]/) $2 = OFS$2 
n = split($0, a, OFS) 
while (a[3] !~ /^ *[0-9]/) 
{      
    a[2] = a[2]a[3] 
    for (i=3; i<=n; ++i) a[i]=a[i+1] 
    --n        
} 
print a[1],a[2],a[3],a[4],a[5] }' RS= FS='\n' OFS='|' Myfile > excel.csv