如何使用没有文件的awk进行打印.
script.sh
#!/bin/sh
for i in {2..10};do
awk '{printf("%.2f %.2f\n", '$i', '$i'*(log('$i'/('$i'-1))))}'
done
Run Code Online (Sandbox Code Playgroud)
sh script.sh
Desired output
2 value
3 value
4 value
and so on
Run Code Online (Sandbox Code Playgroud)
value表示计算后的数量
P..*_*... 11
如果您没有通过文件或标准输入向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
Run Code Online (Sandbox Code Playgroud)
我建议采用不同的方法:
seq 2 10 | awk '{printf("%.2f %.2f\n", $1, $1*(log($1/($1-1))))}'
Run Code Online (Sandbox Code Playgroud)
作为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
Run Code Online (Sandbox Code Playgroud)
注意,我从2开始循环,因为否则i = 1表示log(1/(1-1))=log(1/0)=log(inf)。