没有文件的awk打印

Kay*_*Kay 8 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
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)

  • 这有点晚了,但我认为值得一提:_如果没有任何模式、默认规则或“getline”来处理输入,awk 脚本不会等待输入。_ 我偶然发现了这一点并且在我的[答案](/sf/answers/3161087821/)中对一个类似的问题做了一些详细的阐述。 (2认同)

Mic*_*hrs 6

我建议采用不同的方法:

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


fed*_*qui 5

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