使用 awk '{printf...' 多列

使用 awk '{printf...' 多列

如何使用打印多列awk '{printf...?有了awk '{print...它就很容易了:

$ printf bar\\t5 | awk '{print $2,"baz",$1}'
5 baz bar

但如果我想格式化数字以显示一定数量的小数,其他列就会消失:

$ printf bar\\t5 | awk '{printf "%.3f\n", $2,"baz",$1}'
5.000

我尝试将printf语句放在我想要格式化的每一列之前,但这导致了语法错误:

$ printf bar\\t5 | awk '{printf "%.3f\n",$2, printf "%4s\n","baz", $1}'
awk: cmd. line:1: {printf "%.3f\n",$2, printf "%s\n","baz", $1}
awk: cmd. line:1:                      ^ syntax error

或者printf在每列之前不加格式字符串:

$ printf bar\\t5 | awk '{printf "%.3f\n",$2,"%4s\n","baz", $1}'
5.000

使用时如何显示所有列awk '{printf...

答案1

printf命令要求所有格式字符串位于第一位,%每个输出列一个,然后您可以引用输入中的列,,每列一个:

$ printf bar\\t5 | awk '{printf "%.3f,%4s|%s\n", $2,"baz",$1}'
5.000, baz|bar

您需要在格式字符串中引用与格式字符串后面的输入列完全相同数量的输出列,否则您将收到错误(在本例中,输出格式有三列,而只有两列输入)列):

$printf bar\\t5 | awk '{printf "%.3f,%4s|%s\n", $2,"baz"}'
awk: cmd. line:1: (FILENAME=- FNR=1) fatal: not enough arguments to satisfy format string
        `%.3f,%4s|%s
'
                  ^ ran out for this one

格式字符串中的分隔符是文字,而格式字符串后面使用逗号来描述输入列。

答案2

您没有提供预期的输出,但听起来这可能就是您想要做的,即为 1 个输出字段指定格式,但对尽可能多的其他输出字段使用默认格式,而不列出中所有字段的格式printf 格式化字符串:

$ printf 'bar\t5\n' | awk '{print sprintf("%.3f",$2),"baz",$1}'
5.000 baz bar

或者:

$ printf 'bar\t5\n' | awk '{$3=$1; $1=sprintf("%.3f",$2); $2="baz"} 1'
5.000 baz bar

相关内容