【发布时间】:2017-03-10 04:31:08
【问题描述】:
我想使用 awk 或 shell 脚本计算频谱。我有一个数据,例如,
ifile.txt
1
2
3
4
1
3
2
2
3
99
其中 99 是未定义的值。
我是按以下方式做的。
for i in {1..10};do
awk '{if($1 != 99) printf "%f %f\n",
$1*sin(2*3.14*'$i'*NR/10),
$1*cos(2*3.14*'$i'*NR/10)}' ifile.txt > ifile1.txt
sum_1=$(awk '{sum += $1} END {print sum}' ifile1.txt)
sum_2=$(awk '{sum += $2} END {print sum}' ifile1.txt)
awk '{printf "%f\n", (1/2)*(((1/5)*('$sum_1')^2)+((1/5)*('$sum_2')^2))}'
>> ofile.txt
done
请建议我在哪里做错了。计算既不打印也不结束。但是我在 ifile1.txt 中获取值
【问题讨论】:
-
首先,尝试通过插值将 shell 变量传递给 awk 是个坏主意;其次,它根本不适用于单引号字符串;第三,那不是 awk 程序。
-
awk 和 bash 都是可怕的编程语言。您应该使用脚本语言 perl/python/ruby/javascript 来执行此操作,以使其具有可读性和可维护性。
-
@AndyRay 你听起来像是一个对 awk 或 bash 知识极其有限并且对脚本语言是什么有根本误解的人。我并不是说 awk 或 bash 是 这项工作 的正确工具,但它们都非常擅长它们的工作(并且这两种工具使用的语言都是脚本语言)。 Kay - 你说你是
getting errors- 如果你告诉我们错误消息是什么,你就有更好的机会获得帮助调试这些错误。一般建议 - 从一个更简单的公式开始,获得正确的语法,然后增加复杂性。 -
@Kay 公式中的
END确实让我感到困惑。 AFAIKEND是一种特殊模式,用于在处理完所有输入后执行的操作。我不知道它是否甚至可以在动作内部使用以及 awk 对此有何反应。请编辑您的问题并添加错误输出。 (正如 Ed Morton 已经推荐的) -
@Kay 这应该可以工作:
awk 'BEGIN {printf "%f\n", (1/2)*(((1/5)*('$sum_1')^2)+((1/5)*('$sum_2')^2))}' /dev/null。BEGIN很重要 - 否则脚本什么也不做,因为/dev/null意味着什么都不读。