代码之家  ›  专栏  ›  技术社区  ›  Tim

awk/gawk printf当变量格式字符串,将零改为短划线

  •  1
  • Tim  · 技术社区  · 7 年前

    我有一张用锥子打印的数字表 printf .
    这个 打印 对数字进行截断。

    (cat <<E\OF
    Name,Where,Grade
    Bob,Sydney,75.12
    Sue,Sydney,65.2475
    George,Sydney,84.6
    Jack,Sydney,35
    Amy,Sydney,
    EOF
    )|gawk 'BEGIN{FS=","}
    FNR==1 {print("Name","Where","Grade");next}
    {if ($3<50) {$3=0}
    printf("%s,%s,%d \n",$1,$2,$3)}'
    

    这将产生:

    Name Where Grade
    Bob,Sydney,75 
    Sue,Sydney,65 
    George,Sydney,84 
    Jack,Sydney,0 
    Amy,Sydney,0 
    

    我想要的是将低于50分或缺失的分数显示为破折号(“-”)。

    Name Where Grade
    Bob,Sydney,75 
    Sue,Sydney,65 
    George,Sydney,84 
    Jack,Sydney,- 
    Amy,Sydney,- 
    

    这需要第三个字符串格式 打印 从%d更改为%s。 所以在某些行中,第三列应该是一个值,在某些行中,第三列应该是一个字符串。我怎么能把这件事告诉gawk?或者我应该通过另一个awk重新格式化吗?

    1 回复  |  直到 7 年前
        1
  •  3
  •   Sundeep    7 年前
    $ gawk 'BEGIN{FS=","}
    FNR==1 {print("Name","Where","Grade");next}
    {if ($3<50) {$3="-"} else {$3=sprintf("%d", $3)}
    printf("%s,%s,%s \n",$1,$2,$3)}' ip.txt
    Name Where Grade
    Bob,Sydney,75 
    Sue,Sydney,65 
    George,Sydney,84 
    Jack,Sydney,- 
    Amy,Sydney,- 
    
    • $3
    • sprintf 允许将格式化结果赋给变量
      • int
    • printf 会有 %s


    $ awk -F, -v OFS=, 'NR>1{$3 = $3 < 50 ? "-" : int($3)} 1' ip.txt
    Name,Where,Grade
    Bob,Sydney,75
    Sue,Sydney,65
    George,Sydney,84
    Jack,Sydney,-
    Amy,Sydney,-
    
    • ?: 三元运算符替换if else
    • 1 $0