AWK脚本使用>写入文件却追加而非覆盖的问题求助
AWK中使用
>写入文件却出现追加行为的原因及解决办法 问题原因
你遇到的是AWK文件处理的特有逻辑:当使用print ... > "filename"时,第一次执行该语句会覆盖创建文件并保持文件句柄打开,之后再次执行这条语句时,因为文件已经处于打开状态,AWK会直接在已有内容后追加写入,而非重新覆盖。你的循环执行了1000次,第一次写入覆盖了文件,剩下999次都是在打开的文件句柄后追加,最终导致文件里有1000条记录。
这和Shell中>的行为不同——Shell每次执行>都会重新打开文件并覆盖,而AWK会缓存打开的文件句柄,直到显式关闭或脚本结束。
解决办法
方案1:每次写入后关闭文件
在每次print后显式调用close()关闭文件,这样下次写入时会重新打开并覆盖原有内容:
for (i = 0; i < 1000; i++) { getline < COMMAND MIN2 = $1 close(COMMAND) print MIN2 > "lastValue.txt" close("lastValue.txt") # 显式关闭文件 }
方案2:仅在循环结束后写入最后一次的值
既然你只需要保留最后一次的读数,完全没必要每次循环都写入文件,等循环执行完毕后再写入最终值,这样只会执行一次覆盖写入:
for (i = 0; i < 1000; i++) { getline < COMMAND MIN2 = $1 close(COMMAND) } print MIN2 > "lastValue.txt" # 循环结束后写入最后结果
内容的提问来源于stack exchange,提问作者WhiteRau
相关产品推荐
相关产品推荐

