我需要根据以下格式的/proc/cpuinfo
输出CPU的信息:
Number model name cache size
1 AMD Turion 512 KB
2 Intel 1024 KB
...
为此,我使用了以下bash脚本:
cat /proc/cpuinfo |grep -e "cache size" -e "model name" |awk -f Awk
Awk 的文件代码为:
function getProcNumber(i){
return (i-1)/2 + 1
}
BEGIN {
print("Number\tmodel name\tcache size")
i = 1
}
{
if(i%2 == 1){
printf(getProcNumber(i), " ", $4, " " $5, " ", $6, "\t")
}
else{
print($4, " ", $5)
}
i++
}
我知道,默认情况下print()
会在行中添加换行符。所以我决定使用printf()
。
但是printf()
的输出被print()
分支中的 else
ower写了,我得到了这样的结果:
Number model name cache size
1512 KB
2512 KB
如果我使用print()
代替printf()
,我会得到一个输出,它最接近正确的格式:
编号型号名称缓存大小
1 AMD Turion(tm) II
512 KB
2 AMD Turion(tm) II
512 KB
但是,正如您所看到的,在 II 之后有新的行字符。 如何更改代码以获取所需的输出格式?
答案 0 :(得分:4)
printf
语句中的第一个表达式必须是格式。 (这与C printf
函数相同。)格式是包含转换说明符的字符串,每个转换说明符对应于以下参数。说明符的格式为%<optional modifiers><type>
,其中<type>
是表示转换类型的单个字符:s
(字符串),d
(十进制),f
(固定点),x
(十六进制)等。
如果格式字符串没有说明符,那么它只是打印并且忽略printf的所有以下参数。在你的情况下,printf的第一个参数是一个整数,它肯定不会有任何%
。所以这不是其他论点被覆盖的问题。它们永远不会打印出来。
你想要的可能是这样的:
printf("%d %s %s %s\t", getProcNumber(i), $4, $5, $6)
您可能需要阅读gawk用户指南中的section about printf。
顺便说一句,在awk
中,变量NR
始终是当前行号,因此无需自行计算行数。