首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在awk中保留固定列宽的空间

如何在awk中保留固定列宽的空间
EN

Stack Overflow用户
提问于 2018-05-07 21:33:01
回答 2查看 1.1K关注 0票数 1

我有以下文件:

代码语言:javascript
复制
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                     

想要的产出:

代码语言:javascript
复制
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;                  

我使用以下命令:

代码语言:javascript
复制
awk 'BEGIN{FIELDWIDTHS="6 7 4 2 4 39 7 8 8";OFS=","}{$1=$1}1' Test.txt > Test.csv

我的产出是:

代码语言:javascript
复制
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不保留第六栏中的空格。我怎么才能解决这个问题?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-07 22:10:18

FIELDWIDTHS是gawk特有的,并不总是被支持。显然,您没有调用gawk,也没有调用支持FIELDWIDTHS的gawk版本。

这将适用于任何awk:

代码语言:javascript
复制
$ 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($0,1,poss[i])
        $0 = substr($0,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   ;

只需调整你的职位号码,以达到你真正想要的程度。

票数 1
EN

Stack Overflow用户

发布于 2018-05-07 22:07:47

为此您可以使用printf

您可以使用{$1=$1}代替{ printf("%6s;%7s;%4s;...", $1, $2, $3, ...) } (替换“.”)。有更多的字段)

而且,在您的输出中,FIELDWIDTHS似乎不起作用,因为它看起来好像只是用空白分隔,而不是按列长度分隔。确保您使用了gawk的正确版本。

也要确保磁场宽度是正确的。前4个字段应该是"7 7 5 3.“,而不是"6 7 4 2.”包括空格。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50222766

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档