【问题标题】:How to compute spectrum using awk or shell scripting?如何使用 awk 或 shell 脚本计算频谱?
【发布时间】:2017-03-10 04:31:08
【问题描述】:

我想使用 awk 或 shell 脚本计算频谱。我有一个数据,例如,

ifile.txt
1
2
3
4
1
3
2
2
3
99

其中 99 是未定义的值。

计算频谱的公式是 对于 k=1,2,3,4,...

我是按以下方式做的。

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 确实让我感到困惑。 AFAIK END 是一种特殊模式,用于在处理完所有输入后执行的操作。我不知道它是否甚至可以在动作内部使用以及 awk 对此有何反应。请编辑您的问题并添加错误输出。 (正如 Ed Morton 已经推荐的)
  • @Kay 这应该可以工作:awk 'BEGIN {printf "%f\n", (1/2)*(((1/5)*('$sum_1')^2)+((1/5)*('$sum_2')^2))}' /dev/nullBEGIN 很重要 - 否则脚本什么也不做,因为 /dev/null 意味着什么都不读。

标签: shell awk spectrum


【解决方案1】:

在我们成功对话后,我将我们的共同努力编译成一个独立的 awk 脚本 (spectrum.awk):

$1 < 99 {
  for (i = 1; i <= 10; ++i) {
    sum1[i] += $1*sin(2*3.14*i*NR/10)
    sum2[i] += $1*cos(2*3.14*i*NR/10)
  }
  next
}
END {
  for (i = 1; i <= 10; ++i) {
    printf "%f\n", (1/2)*(((1/5)*(sum1[i])^2)+((1/5)*(sum2[i])^2))
  }
}

它使用数组(sum1sum2)在一次运行中计算所有 10 个值。

不幸的是,我对理论背景一无所知。我看不到您的图像(由于我公司的代理问题)。因此,如果计算错误,您可以提供反馈。

示例会话:

$ echo '1
2
3
4
1
3
2
2
3
99' | awk -f spectrum.awk
1.417046
2.019819
0.288438
2.688501
0.100023
2.680672
0.296974
1.993613
1.338068
44.097319

至少,它看起来“不错”。

【讨论】:

  • 亲爱的,非常感谢您的建议和帮助。我可以往上走几步。但是,仍然没有解决。请你看看我的更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-14
  • 2022-01-18
相关资源
最近更新 更多