固定宽度为CSV

时间:2015-08-11 16:39:02

标签: csv awk fixed-width

我知道如何使用awk将固定宽度更改为CSV。我所拥有的是具有几千个固定宽度文件的硬盘驱动器。所有都包含不同的列宽格式,但它是"编码"在第二行:

Name           DOB      GENDER
============== ======== ======
JOHN DOE       19870130 M
MARY DOE       19850521 F
MARTY MCFLY    19790320 M

我想将所有文件转换为CSV。我可以编写一个读取第一行并保存列名的程序。然后,它加载第二行以获得列宽。然后,它使用awk将该文件转换为CSV。我喜欢做的是找到一个自动执行此操作的程序(可以读取第二行而不是要求我输入列宽?)

1 个答案:

答案 0 :(得分:3)

FIELDWIDTHS\s/\S使用GNU awk:

$ cat tst.awk
BEGIN { OFS="," }
FNR==1 { names=$0; next }
FNR==2 {
    FIELDWIDTHS=""
    while ( match($0,/\S+\s*/) ) {
        FIELDWIDTHS = (FIELDWIDTHS ? FIELDWIDTHS " " : "") RLENGTH
        $0 = substr($0,RSTART+RLENGTH)
    }
    $0 = names
}
{
    for (i=1;i<=NF;i++) {
        sub(/\s+$/,"",$i)
        printf "%s%s", $i, (i<NF?OFS:ORS)
    }
}

$ awk -f tst.awk file
Name,DOB,GENDER
JOHN DOE,19870130,M
MARY DOE,19850521,F
MARTY MCFLY,19790320,M

即使您的第一行在列名称中包含空格,上述操作仍然有效。