awk if-greater-than and replacement under condition

时间:2014-10-10 15:41:27

标签: if-statement replace awk

我有以下数据

  ......
  6       4       4      17     154      93     309       0   11930
  7       3       2     233     311       0   11936   11932  111874
  8       3       1      15       0   11938   11943  211004   11449
  9       3       2      55     102       0   11932   11941  111883
 10       3       2     197     231       0   11925   11921  111849
 11       3       2     160     777       0   11934   11928  111875
 ......

我希望将第4列到第9列的任何大于5000的值替换为0.如何使用awk进行此操作?

2 个答案:

答案 0 :(得分:1)

要打印许多空格,如输入,如下所示:

awk '{for(i=4;i<=NF;i++)if($i>5000)$i=0; for(i=1;i<=NF;i++)printf "%7d",$i;printf"\n"}' file

<强>输出

      6      4      4     17    154     93    309      0      0
      7      3      2    233    311      0      0      0      0
      8      3      1     15      0      0      0      0      0
      9      3      2     55    102      0      0      0      0
     10      3      2    197    231      0      0      0      0
     11      3      2    160    777      0      0      0      0

对于scrunched up together(TM)输出,您可以使用:

awk '{for(i=4;i<=NF;i++)if($i>5000)$i=0}1' file
6 4 4 17 154 93 309 0 0
7 3 2 233 311 0 0 0 0
8 3 1 15 0 0 0 0 0
9 3 2 55 102 0 0 0 0
10 3 2 197 231 0 0 0 0
11 3 2 160 777 0 0 0 0

答案 1 :(得分:0)

另一种方法(需要gawk4+):

{
    patsplit($0, a, "[0-9]+", s)
    printf s[0]
    for (i=1; i<=length(a); i++){
        if(i>4 && a[i]>5000) {
            l=length(a[i])
            a[i]=0
        }
        else l=0
        printf "%"l"s%s", a[i], s[i]
    }
    printf "\n"
}

与示例数据相反,间距变化时更灵活。如果字段数大于9,它也可能比接受的答案更快。