awk 脚本输出中的额外 %

awk 脚本输出中的额外 %

我在 awk 中有以下脚本,它对我通过管道传输到它的文件中的所有列进行求和:

#sum_all.awk
{   for (i=1; i<=NF; i++) { sum[i]+= $i }   }

END { for (i=1; i<=NF; i++ ) { printf "%d ", sum[i] } }

例如:cat my_file.txt | awk -f sum_all.awk

my_file.txt

5 7 8
1 0 2

输出:

6 7 10 %

我怎样才能摆脱最后一个角色%

答案1

END { for (i=1; i<=NF; i++ ) { printf "%d ", sum[i] } ; print "" }

答案2

作为manatwork 已经发表评论%不是 awk 输出的一部分,它是 shell 的下一个提示符。在该END块中,对于该输入文件,有 3 个对printf.第一个输出6和一个空间,第二个输出7和一个空间,第三个输出10和一个空间。此后,awk 退出,shell 打印其提示符。

如果命令打印一些不以换行符结尾的输出(或者更一般地,如果它没有将光标留在行的开头),那么根据您的 shell 的配置,shell 将在命令的输出位于同一行,否则 shell 可能会删除未终止的行并在该行的开头打印其提示符。

为了确保命令的输出完全可见,请确保它以换行符结尾(当然,除非该命令不产生输出)。在unix系统中,非空文本文件总是以换行符结尾,因为文本文件由一系列(可能为空)行组成,每一行由一系列(可能为空)除换行符(和空)之外的字符组成字节)。大多数实用程序往往被设计为主要处理文本文件,因此请确保命令的输出是有效的文本文件。

打印字段后,打印 a "\n"(换行符的 awk 表示法),或调用该print函数,该函数会在打印文本后添加换行符。

END { for (i=1; i<=NF; i++) printf "%d ", sum[i]; print ""; }

或者,为了避免在行尾有额外的空格:

END { for (i=1; i<NF; i++) printf "%d ", sum[i]; printf "%d\n", sum[NF]; }

或者

END { printf "%d"; for (i=2; i<=NF; i++) printf " %d", sum[i]; print ""; }

或者

END { for (i=1; i<NF; i++ ) printf "%d%s", sum[i], (i==NR ? "\n" : " "); }

相关内容