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

时间:2018-06-16 12:05:00

标签: awk printf

我有一张数字表格,我使用printf以awk格式打印 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,- 

这要求printf中的第3个字符串格式从%d更改为%s。 所以在某些行中,第三列应该是一个值,而在某些行中,第三列应该是一个字符串。我怎么能告诉GAWK?或者我应该通过另一个awk来重新格式化?

1 个答案:

答案 0 :(得分:3)

$ 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,- 
  • 使用if-else根据需要为$3分配值
  • sprintf允许将格式化结果分配给变量
    • 对于这种情况,您也可以使用int功能
  • 现在printf %s也会$3


假设您在不需要第三列之后错过了标题和空格的逗号,您可以使用简单的单行

来完成此操作
$ 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
  • 内容的awk习语