awk printf()覆盖print()

时间:2015-03-29 00:04:13

标签: bash awk

我需要根据以下格式的/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 之后有新的行字符。 如何更改代码以获取所需的输出格式?

1 个答案:

答案 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始终是当前行号,因此无需自行计算行数。