我在 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" : " "); }