awk如何在不使用文件的情况下打印输出

12
如何使用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

值表示计算后的数量


是的,你说得对。 - Kay
3个回答

17

如果您没有通过文件或标准输入提供任何输入给awk,那么需要使用BEGIN块。该块在awk执行之前最开始执行,甚至在第一个文件打开之前。

awk 'BEGIN{printf.....

所以它就像:

来自man手册:

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

awk结构:

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

2
这可能有点晚,但我认为值得一提:如果awk脚本中没有任何模式、默认规则或getline用于处理输入,则该脚本不会等待输入。我偶然发现了这一点,并在我的答案中对类似问题进行了详细阐述。 - Scheff's Cat
@Scheff 有趣的信息,看起来如果只有一个 BEGIN,gawk 会立即终止,但如果只有一个 END,它会等待输入。 - Masklinn

7
正如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)


6
我建议采用不同的方法:
seq 2 10 | awk '{printf("%.2f %.2f\n", $1, $1*(log($1/($1-1))))}'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接