使用awk打印输出

时间:2013-11-05 08:58:27

标签: bash shell awk

我有一个包含数字的文本文件

numbers.txt

a,1
b,2
c,2000
d,1001
e,4
f,3

我正在尝试从第2列获取所有值并进行行计数并打印总数

awk -F, '{if($2 >= 0 && $2 <= 999) print "%10s" "%40s" , "Total", $2}' "numbers.txt" | sort -n | wc -l

它只给出了这个

的输出
4

如果我使用printf

awk -F, '{if($2 >= 0 && $2 <= 999) printf "%10s" "%40s" , "Total", $2}' "numbers.txt" | sort -n | wc -l

它只给出了这个

的输出
1

而我需要输出像这样

total 4

1 个答案:

答案 0 :(得分:3)

如果要显示[0,999]范围内具有第二个字段的所有行,并最终显示这些列的数量,那么这可以实现。无需sort -nwc -lawk本身就可以做到:

$ awk -F, '($2 >= 0 && $2 <= 999) {printf "%10s %40s\n" , "Total", $2; i++} END{print "total: "i}' file
     Total                                        1
     Total                                        2
     Total                                        4
     Total                                        3
total: 4

如果你只想要总和:

$ awk -F, '($2 >= 0 && $2 <= 999) i++} END{print "total: "i}' file
total: 4

为什么你的命令不起作用?

使用print

$ awk -F, '{if($2 >= 0 && $2 <= 999) print "%10s" "%40s" , "Total", $2}' a | sort -n
%10s%40s Total 1
%10s%40s Total 2
%10s%40s Total 3
%10s%40s Total 4

行数没问题,但格式不是:要使用%10s,您需要使用printf

使用printf

$ awk -F, '{if($2 >= 0 && $2 <= 999) printf "%10s" "%40s" , "Total", $2}' a
     Total                                       1     Total                                       2     Total                                       4     Total                                       3

根据使用printf而不打印新行,所有输出都在同一行。您只需在每个\n

的末尾添加printf
$ awk -F, '{if($2 >= 0 && $2 <= 999) printf "%10s %40s\n", "Total", $2}' file
     Total                                        1
     Total                                        2
     Total                                        4
     Total                                        3