如何在具有固定列宽的 awk 中保留空格
How to preserve spaces in awk with fixed column width
我有以下文件:
Bonnr. Sessie Tijd As okr Bedrag BTW-laag BTW-hoog
-----------------------------------------------------------------------------------------------------
307717 5555 08:08 AS o 2,80 0,16
308670 5575 11:28 AS mut Supply Needs kenmerk -21,98
FIRM
308671 5575 11:34 AP o 5,60 0,32
想要的输出:
Bonnr.;Sessie;Tijd ;As;okr; ;Bedrag ;BTW-laag; BTW-hoog
------;------;-----;--;---;---------------------------------------;-------;--------;-----------------
307717; 5555;08:08;AS;o ; ; 2,80 ; 0,16;
308670; 5575;11:28;AS;mut;Supply Needs kenmerk ;-21,98 ; ;
; ; ; ;FIRM ; ; ;
308671; 5575;11:34;AP;o ; ; 5,60 ; 0,32;
我使用以下命令:
awk 'BEGIN{FIELDWIDTHS="6 7 4 2 4 39 7 8 8";OFS=","}{=}1' Test.txt > Test.csv
我的输出是:
Bonnr.,Sessie,Tijd,As,okr,Bedrag,BTW-laag,BTW-hoog
-----------------------------------------------------------------------------------------------------
307717,5555,08:08,AS,o,2,80,0,16
308670,5575,11:28,AS,mut,Supply,Needs,kenmerk,-21,98
FIRM
308671,5575,11:34,AP,o,5,60,0,32
我不明白为什么 awk 不保留第六列中的空格。我该如何解决?
您可以为此使用 printf。
您可以 { printf("%6s;%7s;%4s;...", , , , ...) }
代替 {=}
(用更多字段替换“...”)
另外,在您的输出中 FIELDWIDTHS 似乎不起作用,因为它看起来好像只是用空格分隔,而不是按列长度分隔。确保使用正确版本的 gawk。
还要确保字段宽度正确。前 4 个字段可能应该是“7 7 5 3...”,而不是“6 7 4 2...”以包含空格。
FIELDWIDTHS 是特定于 gawk 的,并不总是受支持。您显然没有调用 gawk 或者没有调用支持 FIELDWIDTHS 的 gawk 版本。
这适用于任何 awk:
$ cat tst.awk
BEGIN { split("6 7 4 2 4 39 7 8 8",poss) }
{
for (i=1; i in poss; i++) {
printf "%s;", substr([=10=],1,poss[i])
[=10=] = substr([=10=],poss[i]+1)
}
print
}
$ awk -f tst.awk file
Bonnr.; Sessie; Tij;d ; As ;okr ; Bed;rag BTW;-laag B;TW-hoog
------;-------;----;--;----;---------------------------------------;-------;--------;--------;----------------
307717; 5555; 08:;08; AS ;o ; 2;,80 ; 0,16 ;
308670; 5575; 11:;28; AS ;mut Supply Needs kenmerk ; -21;,98 ; ;
; ; ; ; ; FIRM ; ; ; ;
308671; 5575; 11:;34; AP ;o ; 5;,60 ; 0,32 ;
只需将您的位置数字调整为您真正想要的。
我有以下文件:
Bonnr. Sessie Tijd As okr Bedrag BTW-laag BTW-hoog
-----------------------------------------------------------------------------------------------------
307717 5555 08:08 AS o 2,80 0,16
308670 5575 11:28 AS mut Supply Needs kenmerk -21,98
FIRM
308671 5575 11:34 AP o 5,60 0,32
想要的输出:
Bonnr.;Sessie;Tijd ;As;okr; ;Bedrag ;BTW-laag; BTW-hoog
------;------;-----;--;---;---------------------------------------;-------;--------;-----------------
307717; 5555;08:08;AS;o ; ; 2,80 ; 0,16;
308670; 5575;11:28;AS;mut;Supply Needs kenmerk ;-21,98 ; ;
; ; ; ;FIRM ; ; ;
308671; 5575;11:34;AP;o ; ; 5,60 ; 0,32;
我使用以下命令:
awk 'BEGIN{FIELDWIDTHS="6 7 4 2 4 39 7 8 8";OFS=","}{=}1' Test.txt > Test.csv
我的输出是:
Bonnr.,Sessie,Tijd,As,okr,Bedrag,BTW-laag,BTW-hoog
-----------------------------------------------------------------------------------------------------
307717,5555,08:08,AS,o,2,80,0,16
308670,5575,11:28,AS,mut,Supply,Needs,kenmerk,-21,98
FIRM
308671,5575,11:34,AP,o,5,60,0,32
我不明白为什么 awk 不保留第六列中的空格。我该如何解决?
您可以为此使用 printf。
您可以 { printf("%6s;%7s;%4s;...", , , , ...) }
代替 {=}
(用更多字段替换“...”)
另外,在您的输出中 FIELDWIDTHS 似乎不起作用,因为它看起来好像只是用空格分隔,而不是按列长度分隔。确保使用正确版本的 gawk。
还要确保字段宽度正确。前 4 个字段可能应该是“7 7 5 3...”,而不是“6 7 4 2...”以包含空格。
FIELDWIDTHS 是特定于 gawk 的,并不总是受支持。您显然没有调用 gawk 或者没有调用支持 FIELDWIDTHS 的 gawk 版本。
这适用于任何 awk:
$ cat tst.awk
BEGIN { split("6 7 4 2 4 39 7 8 8",poss) }
{
for (i=1; i in poss; i++) {
printf "%s;", substr([=10=],1,poss[i])
[=10=] = substr([=10=],poss[i]+1)
}
print
}
$ awk -f tst.awk file
Bonnr.; Sessie; Tij;d ; As ;okr ; Bed;rag BTW;-laag B;TW-hoog
------;-------;----;--;----;---------------------------------------;-------;--------;--------;----------------
307717; 5555; 08:;08; AS ;o ; 2;,80 ; 0,16 ;
308670; 5575; 11:;28; AS ;mut Supply Needs kenmerk ; -21;,98 ; ;
; ; ; ; ; FIRM ; ; ; ;
308671; 5575; 11:;34; AP ;o ; 5;,60 ; 0,32 ;
只需将您的位置数字调整为您真正想要的。