awk 打印到文件是附加而不是覆盖

awk print to file is appending not overwriting

提问人:WhiteRau 提问时间:11/16/2023 更新时间:11/16/2023 访问量:46

问:

我有一个 awk 脚本,我需要将命令的输出写入文件。它应该覆盖文件中的值,因此只有一个值。但它是附加的,给了我 1000 个读数,而不仅仅是 1 个。我被难住了。

for (i = 0; i < 1000; i++) {
  getline < COMMAND
  MIN2 = $1
  close(COMMAND)

  print MIN2 > "lastValue.txt"
}

需要明确的是:脚本在其他方面运行良好。我只需要它覆盖,而不是附加。在我看来,这就是它的作用。如果我有,我会期望它附加,所以我不知道为什么它正在做应该做的事情。>>>>>>

Linux 文件 awk

评论

0赞 Ed Morton 11/16/2023
编辑您的问题以显示一个最小的可重现示例,其中包括一个最小的、完整的 awk 脚本,该脚本足以重现您的问题,以及示例输入和预期输出,因此我们最容易为您提供帮助。

答:

1赞 Ed Morton 11/16/2023 #1

你正在考虑 in shell 的语义,awk 不是 shell,因此,除其他外,awk 的含义与 shell 中的意思不同。>>

一个 awk 脚本,例如:

for (i=1; i<=5; i++) {
    print i > "file"
}

与 shell 脚本的语义不同,例如:

a)

for (( i=1; i<=5; i++ )); do
    echo "$i" > file
done

其中 shell [re-]在每次循环迭代中打开输出文件,它与 shell 脚本相同,如下所示:

b)

for (( i=1; i<=5; i++ )); do
    echo "$i"
done > file

其中 shell 仅在循环开始时打开一次输出文件。

如果你想让一个 awk 脚本执行上面的 shell 脚本 “a)” 所做的事情,那就是:

for (i=1; i<=5; i++) {
    print i > "file"
    close("file")
}

对于您的代码来说,这将是:

for (i = 0; i < 1000; i++) {
  getline < COMMAND
  MIN2 = $1
  close(COMMAND)

  print MIN2 > "lastValue.txt"
  close("lastValue.txt")
}

但是我想不出为什么你想写一个文件1000次,然后丢弃前999行,而不是在你完成后只写一次:

for (i = 0; i < 1000; i++) {
  getline < COMMAND
  MIN2 = $1
  close(COMMAND)
}
print MIN2 > "lastValue.txt"

评论

1赞 WhiteRau 11/16/2023
您看不到的脚本正在读取数字输入并将最后一个已知值写入文件。输入的周期性是未知的和随机的,因此需要一个快速的周期。Python 应用程序每秒读取一次文件,以便在其程序中使用。Python 解释器无法足够快地读取输入(≈15ms),以及它为捕捉数字翻转(26ms)所做的其他事情。而且,是的,事后看来,这似乎是显而易见的。我一直在想“bash”而不是“awk”。谢谢。:)close("lastValue.txt")
0赞 WhiteRau 11/16/2023
顺便说一句,我对更有效率的东西持开放态度。该循环仅用于测试目的。而且它只会在捕获数字翻转时写入,理论最大值为 4/秒。 我只是想看看我们能用多大的力气推动它。
0赞 Ed Morton 11/16/2023
如果您需要帮助,请发布一个新问题,
1赞 WhiteRau 11/16/2023
哈哈。你读懂了我的心思,Ed. :)