没有文件的awk打印

awk print without a file

如何在没有文件的情况下使用 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

value表示计算后的数量

如果您不通过文件或标准输入向 awk 提供任何输入,则需要 BEGIN 块。这个块在 awk 执行的一开始就执行,甚至在第一个文件打开之前。

awk 'BEGIN{printf.....

所以就像:

来自手册页:

Gawk executes AWK programs in the following order. First, all variable assignments specified via the -v option are performed. Next, gawk compiles the program into an internal form. Then, gawk executes the code in the BEGIN block(s) (if any), and then proceeds to read each file named in the ARGV array. If there are no files named on the command line, gawk reads the standard input.

awk结构:

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

我建议采用不同的方法:

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

作为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)