固定宽度到 CSV
Fixed width to CSV
我知道如何使用 awk
将固定宽度更改为 CSV。我有一个硬盘,里面有几千个固定宽度的文件。它们都包含不同的列宽格式,但在第二行是 "encoded" 为:
Name DOB GENDER
============== ======== ======
JOHN DOE 19870130 M
MARY DOE 19850521 F
MARTY MCFLY 19790320 M
我想将所有文件转换为 CSV。我可以编写一个程序来读取第一行并将其保存为列名。然后,它加载第二行以获取列宽。然后,它使用 awk
将该文件转换为 CSV。我更愿意做的是找到一个自动执行此操作的程序(awk 可以读取第二行而不需要我输入列宽吗?)
对 FIELDWIDTHS
和 \s/\S
使用 GNU awk:
$ cat tst.awk
BEGIN { OFS="," }
FNR==1 { names=[=10=]; next }
FNR==2 {
FIELDWIDTHS=""
while ( match([=10=],/\S+\s*/) ) {
FIELDWIDTHS = (FIELDWIDTHS ? FIELDWIDTHS " " : "") RLENGTH
[=10=] = substr([=10=],RSTART+RLENGTH)
}
[=10=] = 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
即使您的第一行的列名称中包含空格,以上内容也能正常工作。
我知道如何使用 awk
将固定宽度更改为 CSV。我有一个硬盘,里面有几千个固定宽度的文件。它们都包含不同的列宽格式,但在第二行是 "encoded" 为:
Name DOB GENDER
============== ======== ======
JOHN DOE 19870130 M
MARY DOE 19850521 F
MARTY MCFLY 19790320 M
我想将所有文件转换为 CSV。我可以编写一个程序来读取第一行并将其保存为列名。然后,它加载第二行以获取列宽。然后,它使用 awk
将该文件转换为 CSV。我更愿意做的是找到一个自动执行此操作的程序(awk 可以读取第二行而不需要我输入列宽吗?)
对 FIELDWIDTHS
和 \s/\S
使用 GNU awk:
$ cat tst.awk
BEGIN { OFS="," }
FNR==1 { names=[=10=]; next }
FNR==2 {
FIELDWIDTHS=""
while ( match([=10=],/\S+\s*/) ) {
FIELDWIDTHS = (FIELDWIDTHS ? FIELDWIDTHS " " : "") RLENGTH
[=10=] = substr([=10=],RSTART+RLENGTH)
}
[=10=] = 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
即使您的第一行的列名称中包含空格,以上内容也能正常工作。