awk判断列数并处理

有一个文件,我判断其每行的列数,并做相应处理
NF=5  则打印$1";$2";"$3";;;;;;;;;;;"$9";;;;;;;;;;;"$15
NF=7  则打印$1";$2";"$3";"$4";;;;;;;;;"$9";"$10";;;;;;;;;"$15
NF=9  则打印$1";$2";"$3";"$4";"$5";;;;;;;"$9";"$10";"$11";;;;;;;"$15
NF=11 则打印$1";$2";"$3";"$4";"$5";"$6";;;;;"$9";"$10";"$11";"$12";;;;;"$15
NF=13 则打印$1";$2";"$3";"$4";"$5";"$6";"$7";;;"$9";"$10";"$11";"$12";"$13";;;"$15
NF=15 则打印$1";$2";"$3";"$4";"$5";"$6";"$7";"$8";"$9";"$10";"$11";"$12";"$13";"$14";"$15
我自己编辑了一个,但是执行不成功,能否请各位帮忙看看?谢谢

nawk '{if(NF==5){print $1";$2";"$3";;;;;;;;;;;"$9";;;;;;;;;;;"$15};else if (NF==7) {print $1";$2";"$3";"$4";;;;;;;;;"$9";"$10";;;;;;;;;"$15};else if (NF==9) {print $1";$2";"$3";"$4";"$5";;;;;;;"$9";"$10";"$11";;;;;;;"$15};else if (NF==11) {print $1";$2";"$3";"$4";"$5";"$6";;;;;"$9";"$10";"$11";"$12";;;;;"$15};else if (NF==13) {print $1";$2";"$3";"$4";"$5";"$6";"$7";;;"$9";"$10";"$11";"$12";"$13";;;"$15};else {print $1";$2";"$3";"$4";"$5";"$6";"$7";"$8";"$9";"$10";"$11";"$12";"$13";"$14";"$15;}END}' file

作者: conall   发布时间: 2011-06-02

作者: xiaopan3322   发布时间: 2011-06-02

你想实现什么目的?把案例说出来,我觉得你的代码肯定冗繁了,肯定有改进的地方。

作者: zooyo   发布时间: 2011-06-02

nawk 'NF==5{print $1";$2";"$3";;;;;;;;;;;"$9";;;;;;;;;;;"$15}
NF==7{print $1";$2";"$3";"$4";;;;;;;;;"$9";"$10";;;;;;;;;"$15}
....
NF==15{print $1";$2";"$3";"$4";"$5";"$6";"$7";"$8";"$9";"$10";"$11";"$12";"$13";"$14";"$15}'   urfile

作者: ywlscpl   发布时间: 2011-06-02

不好意思,字段太多了,我看花眼了——最后截取一个发现漏了一个"
对不起,我错了!!!!!

nawk 'NF==5{print $1";$2";"$3";;;;;;;;;;;"$9";;;;;;;;;;;"$15}

作者: conall   发布时间: 2011-06-02

本帖最后由 jason680 于 2011-06-02 13:27 编辑


QUOTE:
你想实现什么目的?把案例说出来,我觉得你的代码肯定冗繁了,肯定有改进的地方。
zooyo 发表于 2011-06-02 11:33



>>把案例说出来,我觉得你的代码肯定冗繁了,肯定有改进的地方。

授之与渔

设好OFS=";"

NF=5 则打印$1";$2";"$3";;;;;;;;;;;"$9";;;;;;;;;;;"$15
      for(n=4;n<=8;n++){$n=";"}for(n=10;n<=14;n++){$n=";"}

NF=7 则打印$1";$2";"$3";"$4";;;;;;;;;"$9";"$10";;;;;;;;;"$15
      for(n=5;n<=8;n++){$n=";"}for(n=11;n<=14;n++){$n=";"}

NF=9 则打印$1";$2";"$3";"$4";"$5";;;;;;;"$9";"$10";"$11";;;;;;;"$15
      for(n=6;n<=8;n++){$n=";"}for(n=12;n<=14;n++){$n=";"}

NF=11 则打印$1";$2";"$3";"$4";"$5";"$6";;;;;"$9";"$10";"$11";"$12";;;; ;"$15
      for(n=7;n<=8;n++){$n=";"}for(n=13;n<=14;n++){$n=";"}

NF=13 则打印$1";$2";"$3";"$4";"$5";"$6";"$7";;;"$9";"$10";"$11";"$12";" $13";;;"$15
      for(n=8;n<=8;n++){$n=";"}for(n=14;n<=14;n++){$n=";"}

NF=15 则打印$1";$2";"$3";"$4";"$5";"$6";"$7";"$8";"$9";"$10";"$11";"$12" ;"$13";"$14";"$15

最后都可以直接print $0

======================
再简化
  NF= 5, 7, 9, 11, 13
    for(n=4+(NF-5)/2;n<=8;n++){$n=";"} for(n=10+(NF-5)/2;n<=14;n++) {$n=";"}
======================
不知可否再简化为
    for(n=4+(NF-5)/2;n<=8;n++){$n=";";${n+6}=";"}
这个应可以
    for(n=4+(NF-5)/2;n<=8;n++){$n=";";m=n+6;$m=";"}

作者: jason680   发布时间: 2011-06-02

看的眼都花了

作者: zhaoke0128   发布时间: 2011-06-02