没有文件的awk打印

时间:2016-11-29 07:08:45

标签: awk gawk

如何使用没有文件的awk进行打印。

script.sh
#!/bin/sh
for i in {2..10};do
awk '{printf("%.2f %.2f\n", '$i', '$i'*(log('$i'/('$i'-1))))}'
done

sh script.sh

Desired output
2   value
3   value
4   value
and so on

值表示计算后的数量

3 个答案:

答案 0 :(得分:9)

如果您没有通过文件或标准输入向awk提供任何输入,则需要BEGIN块。即使在打开第一个文件之前,该块也会在awk执行的最开始执行。

awk 'BEGIN{printf.....

所以它就像:

从手册页:

  

Gawk按以下顺序执行AWK程序。首先,执行通过-v选项指定的所有变量赋值。接下来,gawk将程序编译为内部表单。然后,gawk执行BEGIN块中的代码(如果有的话),然后继续读取ARGV数组中命名的每个文件。如果命令行中没有命名文件,gawk将读取标准输入。

awk结构:

 awk 'BEGIN{get initialization data from this block}{execute the logic}' optional_input_file

答案 1 :(得分:4)

我建议采用不同的方法:

seq 2 10 | awk '{printf("%.2f %.2f\n", $1, $1*(log($1/($1-1))))}'

答案 2 :(得分:4)

作为PS。正确指出,当你没有要阅读的文件时,请使用BEGIN块来打印内容。

此外,在您的情况下,您在Bash中循环,然后在每个循环上调用awk。而是直接在awk

中循环
$ awk 'BEGIN {for (i=2;i<=10;i++) print i, i*log(i/(i-1))}'
2 1.38629
3 1.2164
4 1.15073
5 1.11572
6 1.09393
7 1.07905
8 1.06825
9 1.06005
10 1.05361

注意我在2中开始循环,否则i = 1意味着log(1/(1-1))=log(1/0)=log(inf)