0

嗨,我实际上试图管理一个 awk 脚本,该脚本摆弄一个文本文件,其内容如下

    . [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.描述部分,如果存在于一个单元格中,如果不存在,则将单元格留空,3.一个单元格中的地址部分,4. 一个单元格中的电话号码 5. 一个单元格中的网站.. 如果任何特定组件不存在,则该单元格应留空..

我是 linux 新手,正在尝试处理一些东西,而且对 shell 和 awk 也很陌生。如果有可能,任何人都可以帮助我...

4

3 回答 3

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
于 2014-03-28T14:24:25.853 回答
0

我不得不承认这是一个有点复杂的场景,您必须处理多个行字段,并且我想到了以下要求:

  • 每个字段可能跨越多行
  • 输出需要特殊格式,这里是CSV格式,也就是逗号分隔的文本
  • CSV的转义字符
  • 关于某些字段格式的一些假设,例如电话号码可能以 开头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");
}

还要检查要点片段

于 2012-11-03T09:00:57.393 回答
0

我使用了将由多行分隔的一组记录转换为由 ~ 分隔的单行的逻辑,然后您可以在此之上编写一个逻辑将其转换为 csv 文件(我还没有这样做)

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

注意:假设 [ 不会出现在记录之间

于 2012-06-15T10:25:36.507 回答