【问题标题】:Using for-loop variable in awk print在 awk 打印中使用 for 循环变量
【发布时间】:2020-04-21 13:05:05
【问题描述】:

我正在尝试打印出来

for i in 0.80 0.85 0.90 0.95 1.00 1.05 1.10 1.15 1.20 1.25 1.30 1.35 1.40; do
awk -v a="$i" '{printf "%10.2f %10.2f\n", a, ($8*627.509)}' e1.txt > e2.txt
done

但是当我打开这个文件时,

  1.40 -12111939.85
  1.40 -12112479.17
  1.40 -12112817.98
  1.40 -12112997.55
  1.40 -12113047.39
  1.40 -12112998.93
  1.40 -12112873.57
  1.40 -12112695.74
  1.40 -12112504.02
  1.40 -12112346.74
  1.40 -12112316.49
  1.40 -12112204.51
  1.40 -12112149.56

忽略第二列,因为它读取值并从其他 txt 文件 e1.txt 进行操作。

如图所示,在这种情况下仅使用最后一个 for 循环索引变量。但我希望相应地为每一行打印 0.80 ~ 1.40 的 for 循环值。

【问题讨论】:

  • 您的输出重定向会覆盖循环的每次迭代的输出文件。从“awk”行中删除输出重定向并将其添加到“done”行:done > e2.txt
  • > 更改为 >> 就可以了。

标签: shell for-loop awk


【解决方案1】:

为了提高效率,我会避免处理同一个文件 13 次。

BEGIN 块看起来很别扭,因为 awk 不能声明数组字面量。

awk '
  BEGIN {
    a = "0.80 0.85 0.90 0.95 1.00 1.05 1.10 1.15 1.20 1.25 1.30 1.35 1.40"
    n = split(a, as)
  }
  {
    for (i=1; i <= n; i++)
      printf "%10.2f %10.2f\n", as[i], ($8 * 627.509)
  }
' e1.txt > e2.txt

如果您想要所有的 0.80 首先和所有 1.40 最后,您可以:

awk '...' e1.txt | sort -g > e2.txt

【讨论】:

  • 你可以只做split("0.80 0.85 ...", as),不需要a
猜你喜欢
  • 2016-12-23
  • 2020-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-03
  • 1970-01-01
相关资源
最近更新 更多