如何使用没有文件的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
值表示计算后的数量
答案 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)
。