我有一张数字表格,我使用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来重新格式化?
答案 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,-
$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