2012-06-15 1 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 

и так далее .. огромный файл на самом деле. . и сценарий я сумел написать это

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

эта команда преобразует мой текстовый файл в CSV-файл с записью разделения .. , но как вы можете видеть выше, длины адреса в указанное выше примере, меняет, и я получаю файл csv с нерегулярным форматированием ..

так, что я хочу сделать сейчас изменить команду поставить 1.title компании в одной ячейке, 2.the описательной части, если существует в одной клетке, и если оленья кожа существовать , ячейка должна оставаться пустой, 3. адресная часть в одной ячейке, 4. номер телефона в одной ячейке 5. сайт в одной ячейке. и если какой-либо конкретный компонент не существует, эта ячейка должна быть левый пустой ..

Я новичок в Linux и стараюсь обрабатывать вещи и довольно новый для оболочки и awk тоже .. так может кто-нибудь помочь мне, если это возможно ...

ответ

0

Я использовал логику преобразования одного набора записей, разделенных несколькими строками, на одну строку, разделенную на ~ . Затем вы можете написать логику поверх этого, чтобы преобразовать ее в файл csv (который я еще не сделал)

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

Примечание: Предположим, что [не придет между записями

+0

nope buddy. .. это просто испортило формат, который я уже создал! –

+0

можно ли использовать функцию соответствия, чтобы вытащить ее? Я просто смущен и борется с ним. вот что произойдет, если нуб вроде меня начинает работать над серьезными вещами! –

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